[剑指Offer] 43.左旋转字符串
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
【思路1】将第一个字符移到最后面,执行n次,时间复杂度为O(m*n)。
1 class Solution { 2 public: 3 string LeftRotateString(string str, int n) { 4 if(str.length() <= n) 5 return str; 6 for(int i = 0;i < n;i ++){ 7 char c = str[0]; 8 for(int j = 0;j < str.length() - 1;j ++) 9 str[j] = str[j + 1]; 10 str[str.length() - 1] = c; 11 } 12 return str; 13 } 14 };
【思路2】使用STL中的reverse()函数,时间复杂度O(n)。
假设原序列有n位,循环左移i位的过程如下:
(1)reverse(0,i-1); (2)reverse(i,n-1); (3)reverse(1,n-1);
例如原序列:abcdefg,循环左移3位:(1) cba defg (2)cba gfed (3) defgabc
代码就非常简单了,而且reverse操作非常简单,效率高也不容易出错,要记住一点就是STL中的迭代器是左闭右开区间,所以reverse操作的第二个参数需要往后移动一位。
1 class Solution { 2 public: 3 string LeftRotateString(string str, int n) { 4 if(str.length() <= n) return str; 5 reverse(str.begin(),str.begin() + n); 6 reverse(str.begin() + n,str.end()); 7 reverse(str.begin(),str.end()); 8 return str; 9 } 10 };
【思路3】使用substr()函数。
注:str.substr(pos, n)返回一个字符串,包含s中从下标pos开始的n个字符。
1 class Solution { 2 public: 3 string LeftRotateString(string str, int n) { 4 int len = str.length(); 5 if(len <= n) return str; 6 n %= len; 7 str += str; 8 return str.substr(n,len); 9 } 10 };