字符串循环左移

题目描述:给定一个字符串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翻转字符串函数

posted @ 2015-04-10 11:17  bigshowxin  阅读(329)  评论(0编辑  收藏  举报