题源: 541. 反转字符串 II
解题思路
-
遍历字符串:从索引
0
开始,每次增加2k
来定位下一组需要处理的字符。这种方式可以确保每次处理完一组2k
字符后,直接跳到下一个2k
字符段的开始。 -
反转判断:对于每个起始位置
i
:- 如果
i + k
小于或等于字符串的长度,说明从i
开始的位置至少有k
个字符,可以安全地反转从i
到i + k
的字符。 - 如果
i + k
大于字符串长度,说明从i
开始到字符串末尾的字符不足k
个,此时应该将这部分字符全部反转。
- 如果
-
反转操作:使用 C++ STL 中的
reverse
函数对指定范围内的字符进行反转。reverse
接受两个迭代器,分别是要反转的范围的开始和结束位置。
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串
s
的长度。尽管每2k
个字符会进行一次反转,但每个字符至多被反转一次。 - 空间复杂度:O(1)。除了输入字符串外,没有使用额外的空间。反转操作是在原字符串上进行的,不需要额外的空间。
Code
class Solution {
public:
string reverseStr(string s, int k) {
for(int i = 0;i < s.size();i += 2*k){
// 检查当前剩余字符是否足够 k 个,足够则反转 k 个,不足则全部反转
if(i + k <= s.size()) reverse(s.begin() + i, s.begin() + i + k);
else reverse(s.begin() + i, s.end());
}
return s;
}
};