题目描述
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部,如把字符串abcdefg左旋转3位得到字符串defgabc。
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。
解法一:暴力移位
即每次移1位,移m次,空间复杂度为O(1),但时间复杂度达到了O(m*n);
void leftshift1bit(char* s, int n){
char c = s[0];
for(int i = 1; i < n; ++i)
s[i-1] = s[i];
s[n-1] = c;
}
void leftshift(char* s, int n, int m){
while(m--){
leftshift1bit(s, n);
}
}
解法二:三次反转法
我们注意到这样一个事实:对于 "abcdefg",当 m = 3 时,我们要得到的结果是 "defgabc",而 "defgabc" = (defg)(abc) = ((abc)'(defg)')';于是我们可以进行三次反转来进行左旋转操作。空间复杂度为O(1),时间复杂度为O(n);
void inverse(char* s, int start, int finish){
int len = finish - start;
for(int i = 0; i < len/2; ++i)
swap(s[start + i], s[finish-1-i]);
}
void leftshift(char* s, int n, int m){
inverse(s, 0, m);
inverse(s, m, n);
inverse(s, 0, n);
}