1. 算法描述
给定一个字符串和一个整数k, 从字符串首字符开始,每2k个字符,反转前面k个字符。
(1)如果字符串长度小于k, 则反转所有字符串;
(2)如果字符串长度小于2k并且大于或等于k,则反转前面k个字符,剩余字符保持原来顺序。
例如:
Input: s = “abcdefg”, k = 2
Output: “bacdfeg”
2. 思想分析
(1)如果s.length() >= 2k, reverse前面k个字符串。
同时,将前2k个字符,累加到结果字符串;后2k个字符更新为s, 用来进行下一次处理。
(2)如果s.length() >= k, reverse前面k个字符串。
将这k个字符串累加到结果中。
同时s清空,退出while循环。
(3)当s.length() < k,直接反转所有字符。
3. 参考代码
(个人leetcode算法均本着容易理解为第一原则,尽量提升效率。)
class Solution {
public:
string reverseStr(string s, int k) {
string result;
while (s.length() >= k)
{
if (s.length() >= 2 * k)
{
reverse(s.begin(), s.begin() + k);
result += s.substr(0, 2 * k);
s = s.substr(2 * k);
}
else if (s.length() >= k)
{
reverse(s.begin(), s.begin() + k);
result += s;
s.clear();
}
}
reverse(s.begin(), s.end());
result += s;
return result;
}
};