左旋转字符串问题 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)个循环链,对每个循环链分别进行一次内循环就行了.
方法二:三歩反转法
例如字符串s = ab, 其中a、b为子串,先将a,b分别反转,再将ab整体反转,就可以实现左旋的操作。
记录我的第一篇文章
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串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
记录我的第一篇文章
相关文章推荐
- 字符串问题python实现(三)
- 计算4000000000内的最大f(n)=n值---字符串的问题python实现(五岁以下儿童)
- 字符串问题python实现(四)
- 字符串包含问题 python实现
- 字符串问题python实现(一)
- 字符串包含问题 python实现
- Python + PHP + RSA 实现加密(解决Python-RSA无法解密一般字符串的问题)
- 字符串问题python实现(二)
- 计算4000000000以内最大的f(n)=n的值---字符串问题python实现(五)
- 左旋转字符串python实现
- 8皇后问题Python与C++实现
- Python字符串的encode与decode研究心得——解决乱码问题
- Python字符串的encode与decode研究心得乱码问题解决方法
- Python字符串的encode与decode研究心得——解决乱码问题
- (转)Python字符串的encode与decode研究心得——解决乱码问题
- python字符串编码常见问题
- iphone中实现类似ASCII编码返回字符串长度类型的问题
- Python字符串乱码问题
- Python字符串的encode与decode研究心得——解决乱码问题
- Python代码实现Java本地化资源字符串的检查,防止出现空指针异常