题目描述:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。
最近开始学习python,所以特意用python来实现,主要还是记录下来方便自己复习。思路均来自结构之法 算法之道博客。更详解透彻的讲解,请参考http://blog.csdn.net/v_july_v/article/details/6322882。
方法一:循环移位法
序号为 (i + j* m) % n(i为0到gcd(n, m)-1之间的某一整数,j = 0:n-1)会构成一个循环链,一共有gcd(n, m)个循环链,对每个循环链分别进行一次内循环就行了.
#!/usr/bin/env python
def gcd(a, b):
if a < b:
a,b = b,a
while b != 0:
tmp = a%b
a,b = b,tmp
return a
def my_rotate(s,m):
n = len(s)
numofGroup = gcd(n, m)
elem = n/numofGroup
for i in xrange(numofGroup):
tmp = s[i]
for j in xrange(elem-1):
s[(i + j * m)%n] = s[(i + (j+1)*m)%n]
s[(i + (elem-1) * m)%n] = tmp
if __name__ == '__main__':
s = 'abcdefghi'
print ' the origin string :', s
s = list(s)
my_rotate(s,3)
s = ''.join(s)
print ' the rotated string :', s
方法二:三歩反转法
例如字符串s = ab, 其中a、b为子串,先将a,b分别反转,再将ab整体反转,就可以实现左旋的操作。
def invert(s, m, n):
while m < n:
s[m],s[n] = s[n],s[m]
n -= 1
m += 1
记录我的第一篇文章