力扣第541题 反转字符串 II c++注释 双指针基础版

题目

541. 反转字符串 II

简单

给定一个字符串 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

思路和解题方法

  1. 声明一个整数变量i用于循环迭代,初始值为0。
  2. 在循环中,每次以2k为步长进行迭代,即每次处理2k个字符。
  3. 对于每个组,判断如果当前位置i加上k仍然小于等于字符串s的大小,则表示该组内有足够的k个字符可以进行反转操作。
    • 调用reverse函数对从ii+k-1的字符进行反转操作。
    • 继续下一次迭代。
  4. 如果剩余字符不足k个,则将剩余字符全部反转。
    • 调用reverse函数对从i到末尾位置s.size()-1的字符进行反转操作。
  5. 循环结束后,返回最终得到的字符串s

在函数中还定义了一个辅助函数reverse,用于将给定字符串s中指定范围从ij的字符进行反转操作。

复杂度

        时间复杂度:

                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--;
        }
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

你可能感兴趣的:(leetcode,数据结构,算法,leetcode,c++,双指针)