题目描述
给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。
示例:
输入: s = “abcdefg”, k = 2
输出: “bacdfeg”
要求:
该字符串只包含小写的英文字母。
给定字符串的长度和 k 在[1, 10000]范围内。
来源:力扣(LeetCode)
链接:字符串区间部分翻转
代码示例:
class Solution {
public:
//翻转字符串的函数
void _reverseStr(string& s, int left, int right)
{
while (left < right)
{
swap(s[left], s[right]);
++left;
--right;
}
}
string reverseStr(string s, int k) {
int len = s.size();
if (k > len)//k初始值大于 s.size()的话直接全部翻转
{
_reverseStr(s, 0, len - 1);
return s;
}
int left = 0, right = 0;//记录每一次需要翻转的字符串边界
int i;
for (i = 0; i + k * 2 < len; i = i + k * 2)//这里i代表左边界的值, 注意跳出条件, 左边界加2k大于等于 len 的时候就该跳出了
{
left = i;
right = i + k - 1;
_reverseStr(s, left, right);
}
if (len - i + 1 < k)//跳出之后对剩余字符的数量进行判断并进行对应翻转, 只需要注意边界条件即可
{
_reverseStr(s, i, len - 1);
}
else
{
_reverseStr(s, i, i + k - 1);
}
return s;
}
};