题目描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例2:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
解题思路
这道题需要处理两个问题;1.反转字符串,2.进行遍历。主要难度在第二个问题上,需要注意的是我们每一次循环遍历的是2K个元素,而只把前K个元素进行反转。
class Solution {
public:
void fanzhuan(string &s,int start,int end){//反转字符串
while(start<=end){
swap(s[start++],s[end--]);
}
}
string reverseStr(string s, int k) {
int len=s.length();
int i=0;
if(len<=k)//情况1如果剩余字符少于 k 个 全部反转
fanzhuan(s,0,len-1);
else{//情况2
while(len>k){//判断当前剩余的字符长度和K作比较
fanzhuan(s,i*k,(i+1)*k-1);//每次只反转前K个元素
len=len-2*k;//每遍历2K个元素后,还有多少个元素
i+=2;//不是i++ 而是i+=2
}
fanzhuan(s,i*k,s.length()-1);//最后一次的遍历元素不足K个时,需要处理
}
return s;
}
};