有趣的算法-旋转字符串

来源:互联网 发布:手机翻译软件推荐 编辑:程序博客网 时间:2024/06/04 19:51

题目:

给定一个字符串,要求把字符串前面的若干个字符移动到字符串的尾部,如把字符串“abcdef”前面的2个字符'a'和'b'移动到字符串的尾部,使得原字符串变成字符串“cdefab”。请写一个函数完成此功能,要求对长度为n的字符串操作的时间复杂度为 O(n),空间复杂度为 O(1)。


说明:

    因为Python的字符串是不可变对象,所以,这里使用了list = ['']代替了C语言里的字符串.


暴力旋转:

#coding:utf8#sorign 原始字符串#starget 目标字符串,需要用来移动的那小段#start 需要移动字符串在原始字符串中的下标#end 目标字符串,最终需要被移动到的在原始字符串的下标位置def shiftCharP(sorigin, starget, start, end):    '逐个移位,暴力移位法'    leno = len(sorigin)    lent = len(starget)    offset = end - start    print 'leno:%d,lent:%d,offset:%d'%(leno,lent,offset)    for i in range(lent):        t = sorigin[start]        for index in range(offset):            sorigin[start + index] = sorigin[start+index+1]            print index,' - ',sorigin[start]        sorigin[start + offset] = t        print "i:%d,start:%d,offset:%d"%(i,start,offset)    print starget    print sorigin'''    测试代码'''ass = ['1',' ','2','3','4',' ','5','6','7','8',' ','9']ts = ['2','3','4']shiftCharP(ass, ts, 2, len(ass) -1)


巧妙旋转:

说明:

    将需要操作的字符串看成一个数组,origin[],将origin分成AB两组,按题目要求实现旋转成BA,A' = A^T, B' = B^T, 反转(A^T+B^T)^T = BA

Python代码:

#coding:utf8def refs(s):    '反转数组元素'    length = len(s)    start = 0    end = length - 1    while start < end:        t = s[start]        s[start] = s[end]        s[end] = t        start += 1        end -= 1    return s#s 需要进行操作的数组#end 需要旋转的位置def useRefsToTail(s, end):    '旋转移位'    #获取总数组长度    length = len(s)    #先进行分组,然后内部反转后,再组合    ss = refs(s[:end]) + refs(s[end: length])    print ss    #再进行整理反转    ss = refs(ss)    print ss    return ss'''    以下测试代码:'''s = ['i',' ','l','o','v','e',' ','u']print useRefsToTail(s, 2)
0 0
原创粉丝点击