题目:
给定一个字符串S[0...N-1],要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符'a','b'移动到字符串的尾部,得到新的字符串"cdefab":即字符串循环左移k位。
算法要求:时间复杂度O(N),空间复杂度为O(1)
*循环左移k位等价于循环右移N-k位
方法:
1.暴力移位法
每次循环左移1位,调用k次即可
时间复杂度O(kN),空间复杂度O(1)
2.三次拷贝
s[0..k] ---> T[0..k]
s[k+1..N-1] --->s[0..N-k-1]
T[0..k] --->s[N-k...N-1]
时间复杂度O(N),空间复杂度O(k)
说明:先把s中的前k位移动到一个临时数组T中,然后再把s中的k位后面的字符串移动到
开头,再把T中的字符追加到s后面
3.三次反转
(x'y')'=yx
如:abcdef
X=ab X'=ba
Y=cdef Y'=fedc
(X'Y')'=(bafedc)'=cdefab
时间复杂度O(N),空间复杂度O(1)
我们选择第三种方法代