一、题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串 "abcdefg"
和数字 2
,该函数将返回左旋转两位得到的结果 "cdefgab"
。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
二、题解
创建一个与字符串等长的辅助空间,然后依次映射,时间复杂度与空间复杂度均为 O ( n ) O(n) O(n):
class Solution {
public:
string reverseLeftWords(string s, int k) {
string result(s.size(), 0);
for (int i = 0; i < s.size(); i++) {
result.at((i + s.size() - k) % s.size()) = s.at(i);
}
return result;
}
};
字符串左移的本质是头部字符串移到尾部,尾部字符串移到头部,因此我们可以先将字符串整体逆置,再依次逆置前后两部分的子字符串。这种方法的时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
这里需要注意的是,如果是左移k位,需要以 s.end() - k
作为前后分隔,如果是右移k位,则需要以 s.begin() + k
作为前后分隔。
class Solution {
public:
string reverseLeftWords(string s, int k) {
k = k % s.size();
reverse(s.begin(), s.end());
reverse(s.begin(), s.end() - k);
reverse(s.end() - k, s.end());
return s;
}
};