剑指offer43_左旋转字符串_题解
左旋转字符串
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
示例1
输入
"abcXYZdef",3
返回值
"XYZdefabc"
分析
方案一:字符串切片拼接
获取字符串 s[n:] 切片和 s[:n] 切片,使用 "+" 运算符拼接并返回即可。
代码
/**
1.时间复杂度:O(N)
其中N为字符串s的长度,字符串切片函数为线性时间复杂度
2.空间复杂度:O(N)
两个字符串切片的总长度为N
**/
class Solution
{
public:
string LeftRotateString(string s, int n)
{
int len = s.length();
if (n > len)
n %= len;
string ret = s.substr(n, len) + s.substr(0, n);
return ret;
}
};
方案二:局部反转+整体反转
- 反转区间为前n的子串
- 反转区间为n到末尾的子串
- 反转整个字符串
代码
/**
1.时间复杂度:O(n)
2.空间复杂度:O(1)
**/
class Solution{
public:
string LeftRotateString(string s, int n){
int len = s.length();
if(n > len)
n %= len;
reverse(s.begin(), s.begin() + n);
reverse(s.begin() + n, s.end());
reverse(s.begin(), s.end());
return s;
}
};