字符串之字符串左旋

参考自:http://blog.csdn.net/v_july_v/article/details/6322882


左旋转字符串  

* 题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 

* 如把字符串abcdef左旋转2位得到字符串cdefab。 

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

算法1:不考虑时间和空间的限制。设移动的位数为k。则循环k次,每次移动1位。这样的空间复杂度是O(1),时间复杂度是O(n*k)。如果k大于n,则O(n^2)。因此,如果K > N,右移K-N之后的数组序列跟右移K位的结果是一样的。

算法2:反转前k个字符,然后反转后n-k个字符,最后反转整个字符串。时间复杂度为O(n),空间复杂度为O(1)。

算法3:每次向右移动K位,最后递归。

把一个规模为N的问题化解为规模为M(M<N)的问题。
    举例来说,设字符串总长度为L,左侧要旋转的部分长度为s1,那么当从左向右循环交换长度为s1的小段,直到最后,由于剩余的部分长度为s2(s2==L%s1)而不能直接交换。

    该问题可以递归转化成规模为s1+s2的,方向相反(从右向左)的同一个问题。随着递归的进行,左右反复回荡,直到某一次满足条件L%s1==0而交换结束。

算法4:假如不需要源字符串反转,使用ACM的做法,输出K+1到m,把m设为‘\0’输出前k位。

原文地址:https://www.cnblogs.com/catkins/p/5270740.html