简单
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
k
个,则将剩余字符全部反转。2k
但大于或等于 k
个,则反转前 k
个字符,其余字符保持原样。示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
提示:
1 <= s.length <= 104
s
仅由小写英文组成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),没有使用额外的空间,只是对原字符串进行了原地修改。没有使用额外的数组或数据结构来存储中间结果。因此,空间复杂度是常量级别的。
- 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--;
- }
- }
- };
觉得有用的话可以点点赞,支持一下。
如果愿意的话关注一下。会对你有更多的帮助。
每天都会不定时更新哦 >人< 。