您的位置:首页 > 编程语言 > Python开发

左旋转字符串问题 python实现

2014-11-10 09:31 351 查看
题目描述

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串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
= s
,s[m]
n -= 1
m += 1


记录我的第一篇文章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: