Problem: 剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。(与2010年408真题类似)
示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”
限制:
1 <= k < s.length <= 10000
思路
可以用暴力解法,就是每次取出第0位,将后面n-1个依次前移,再将原始的第0个数的值放到最后,但这种方法的时间复杂度为O(n^2),不太理想。所以考虑采取另一种方法。
解题方法
1、翻转整个数组
“abcdefg”–>“gfedcba”
2、翻转数组n-p ~ n-1之间这部分
“gfedcba”–>“gfedcab”
3、翻转数组0 ~ n-p-1之间这部分
“gfedcab”–>“defgab”
复杂度
- 时间复杂度:
O ( n ) O(n) O(n)
- 空间复杂度:
O ( 1 ) O(1) O(1)
Code
class Solution {
public:
void Reverse(string &s, int l, int r) { //定义实现一个翻转(逆置)的函数
char temp;
while (l < r) {
temp = s[l];
s[l] = s[r];
s[r] = temp;
l++;
r--;
}
}
string reverseLeftWords(string s, int k) {
int n = s.size();
if (k > 0 && k < n) {
Reverse(s, 0, n - 1);
Reverse(s, n - k, n - 1);
Reverse(s, 0, n - k - 1);
}
return s;
}
};