力扣第541题 反转字符串 II c++注释 双指针基础版
题目
简单
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
提示:
1 <= s.length <= 104s仅由小写英文组成1 <= k <= 104
思路和解题方法
- 声明一个整数变量
i用于循环迭代,初始值为0。- 在循环中,每次以2k为步长进行迭代,即每次处理2k个字符。
- 对于每个组,判断如果当前位置
i加上k仍然小于等于字符串s的大小,则表示该组内有足够的k个字符可以进行反转操作。
- 调用
reverse函数对从i到i+k-1的字符进行反转操作。- 继续下一次迭代。
- 如果剩余字符不足k个,则将剩余字符全部反转。
- 调用
reverse函数对从i到末尾位置s.size()-1的字符进行反转操作。- 循环结束后,返回最终得到的字符串
s。在函数中还定义了一个辅助函数
reverse,用于将给定字符串s中指定范围从i到j的字符进行反转操作。
复杂度
时间复杂度:
O(n)
时间复杂度是O(n),其中n是字符串的长度。循环迭代的次数是字符串长度的一半,因为每次迭代处理2k个字符。
空间复杂度
O(1)
空间复杂度是O(1),没有使用额外的空间,只是对原字符串进行了原地修改。没有使用额外的数组或数据结构来存储中间结果。因此,空间复杂度是常量级别的。
c++ 代码
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size();
// 遍历字符串,每次步长为2k
for(int i = 0; i < n; i += 2*k) {
// 反转前k个字符或剩余字符中的全部字符
reverse(s, i, min(i + k - 1, n - 1));
// if(i+k<=s.size())
//{
// reverse(s,i,i+k-1);
// continue;
//}
//reverse(s,i,s.size()-1);
}
return s;
}
// 辅助函数:反转字符串s中从i到j的字符
void reverse(string& s, int i, int j) {
while(i < j) {
swap(s[i], s[j]);
i++;
j--;
}
}
};
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。
浙公网安备 33010602011771号