题目描述
原题链接:541. 反转字符串 II
一、自己实现reverse左闭右闭
class Solution {
public:
void reverseS(int l, int r, string &s) {
while(l < r)
swap(s[l++], s[r--]);
}
string reverseStr(string s, int k) {
int n = s.size();
for(int i = 0; i < n; i = i + 2*k){ // 每次跳2k,注意要i < n,不能i < n - k,因为可能还有后半部分需要逆转处理
// 遍历到最后面小于等于k个,逆转后跳出for循环
if(n - i <= k) { // 因为i从0开始,n和k都为从1开始的长度,因此含有等于
reverseS(i, n - 1, s);
break;
}
reverseS(i, i + k - 1, s);
}
return s;
}
};
时间复杂度
O
(
n
)
O(n)
O(n)
空间复杂度
O
(
1
)
O(1)
O(1)
二、reverse接口左闭右开
reverse()为左闭右开,C++ reverse函数的用法
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.size();
for(int i = 0; i < n; i += 2*k) {
if(i + k <= n) { // i+k不超过n时,有k个字符可进行反转
reverse(s.begin() + i, s.begin() + i + k);
} else { // 遍历到最后不到k个数,将剩余数反转
reverse(s.begin() + i, s.end());
}
}
return s;
}
};
参考文章:541. 反转字符串II