【LeetCode字符串#04】左旋转字符串,以及反转函数使用说明
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
限制:
1 <= k < s.length <= 10000
思路
和旋转字符串的思路类似,利用整体翻转来达到目的
具体如下:
代码
照着思路来写就可以
class Solution {
public:
//定义反转函数
void reverse(string& s, int start, int end){
for(int i = start, j = end; i < j; i++, j--){
swap(s[i], s[j]);
}
}
string reverseLeftWords(string s, int n) {
//1、反转0到k范围内的字符
for(int i = 0; i < s.size(); ++i){
if(i == n){
reverse(s, 0, i - 1);
break;
}
}
//2、将字符串整体反转
reverse(s, 0, s.size() - 1);
//3、将除了移动到末尾的部分进行反转,恢复正常顺序
reverse(s, 0, s.size() - n - 1);
return s;
}
};
注意点
1、明确你反转的到底是哪个字符
这点很重要,包括在之前的题目中也要注意
举个例子
string s = "abcd";
i = 2
reverse(s, 0, i);
这里反转的结果是什么?
是你所期望的 "bacd" 吗?
肯定不是,此时运行的结果是 "cbad"
也就是说,当要进行反转操作时,要考虑需不需要连同当前指针指向的字符一块反转(一般是不需要)
如果不需要,记得对反转区间的**右边界减1
2、不要漏了引用符号
定义反转函数时如果漏了'&',那么s是不会被进行任何操作的
是void reverse(string& s, int start, int end)而不是void reverse(string s, int start, int end)