思路整理自剑指Offer
一:题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
二:解题思路
利用翻转字符串的方式解决该问题
如“abcdefg” 左移两位--》"cdefgab"
我们将它分成两部分:
第一部分:前两个字符
第二部分:后面的字符
分别将两部分旋转“ab”->"ba","cdefg"->"gfedc" ===>"bagfedc"
再将得到的字符串翻转“cdefgab”,刚好是我们将字符串左移两位的结果
所以相当于调用两次Reverse函数(翻转字符串),就可以实现字符串左移的功能
三:代码实现
class Solution {
public:
//翻转字符串
void Reverse(string &str,int start,int end){
char temp;
while(start<end){
temp=str[start];
str[start]=str[end];
str[end]=temp;
start++;
end--;
}
}
string LeftRotateString(string str, int n) {
if(str.empty() || n<=0)
return str;
//如果n>字符串的长度
n=n%str.size();
//翻转字符串前n个字符
Reverse(str,0,n-1);
//翻转字符串剩余的字符
Reverse(str,n,str.size()-1);
//翻转字符串
Reverse(str,0,str.size()-1);
return str;
}
};
网友更简洁的方法:
class Solution {
public:
string LeftRotateString(string str, int n) {
int len = str.length();
if(len == 0) return "";
n = n % len;
str += str;
return str.substr(n,len);
}
};