目录
一、题目内容
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
提示:
该字符串只包含小写英文字母。
给定字符串的长度和 k 在 [1, 10000] 范围内。
leetcode_541. 反转字符串 II
二、题解思路
定义一个变量,用于记录一组中交换的起始位置begin
,再一个变量,用于记录一组中要交换的最后一个位置begin+k-1
。先判断剩余字符个数len-begin
是否小于k个,小于就将最要交换的最后一个位置置为字符串最后一个位置,如果不小于就进行交换,最后更新起始交换位置,让它成为原来的位置加上2*k的位置
三、代码
class Solution {
public:
string reverseStr(string s, int k)
{
int len = s.size();
int begin = 0;
while (begin < len)
{
int tmp1 = begin;//起始的交换位置
int tmp2 = begin + k - 1; //要交换的最后一个位置
if (len - begin < k)//剩余字符少于 k 个,将剩余字符全部反转
{
tmp2 = --len;
}
while (tmp1 < tmp2)
{
swap(s[tmp1], s[tmp2]);
++tmp1;
--tmp2;
}
//更新begin
begin =begin + 2*k;
}
return s;
}
};