标签:
题目描述:给定一个字符串S[0...N-1],要求把S的前k 个字符移动到S的尾部,如把字符串“abcdef” 前面的2个字符‘a’、‘b’移动到字符串的尾 部,得到新字符串“cdefab”:即字符串循环左移k。
算法要求:时间复杂度为O(n),空间复杂度为O(1)。
问题分析:
1、暴力移位法
每次循环左移1位,调用k次,时间复杂度O(kn),空间复杂度O(1)
2、开辟一个k+1长度的数组,做三次拷贝
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)
这二种都不符合算法要求。
其实有种能满足条件的算法:
(X’Y’)’=YX
如:abcdef
X=ab X’=ba
Y=cdef Y’=fedc
(X’Y’)’=(bafedc)’=cdefab
时间复杂度O(N),空间复杂度O(1)
代码实现:
1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 void ReverseString(string &str, int m, int n) 6 { 7 for(int i = m; i < n; ++i) 8 { 9 char temp = str[i]; 10 str[i] = str[n]; 11 str[n] = temp; 12 --n; 13 } 14 } 15 16 int main(int argc, const char *argv[]) 17 { 18 string str = "abcdef"; 19 int len = str.size(); 20 int k = 2; //循环左移2位 21 k %= len; //防止越界 22 ReverseString(str, 0, k - 1); 23 ReverseString(str, k, len -1); 24 ReverseString(str, 0, len - 1); 25 cout << str << endl; 26 return 0; 27 }
结果:
ps:STL里提供了reverse翻转字符串函数
标签:
原文地址:http://www.cnblogs.com/bigshowxin/p/4414043.html