左旋转字符串问题 python实现

题目描述
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdef左旋转2位得到字符串cdefab。

请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。


最近开始学习python,所以特意用python来实现,主要还是记录下来方便自己复习。思路均来自结构之法 算法之道博客。更详解透彻的讲解,请参考http://blog.csdn.net/v_july_v/article/details/6322882。

方法一:循环移位法

序号为 (i + j* m) % ni为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

记录我的第一篇文章



你可能感兴趣的:(程序员编程艺术学习笔记,python实现)