541. 反转字符串 II

189 阅读2分钟

这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战

541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每 2k 个字符反转前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2 输出:"bacdfeg" 示例 2:

输入:s = "abcd", k = 2 输出:"bacd"

解题思路

题目要求比较简单,就是按照规则反转特定区间的字符串即可。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。 对于上述两种情况,我们可以作一个通用的处理 reverse(chars,i,Math.min(s.length()-1,i+k-1));

在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,不需要搞一个计数器,来统计2k,再统计前k个字符

对于剩余字符小于 2k的情况,我们尽量去取翻转k个字符,如果字符个数不足k的,就将剩余字符全部翻转

代码

class Solution {
        public void reverse(char[] chars, int l,int r) {

            while (l<r)
            {
                char t=chars[l];
                chars[l]=chars[r];
                chars[r]=t;
                r--;
                l++;
            }
        }
        public String reverseStr(String s, int k) {

            int i=0;
            char[] chars = s.toCharArray();
            while (i<chars.length)
            {
                reverse(chars,i,Math.min(s.length()-1,i+k-1));
                i+=2*k;
            }
            return new String(chars);
            
        }
}
  • 时间复杂度:O(n),其中 n 是字符串 s 的长度。

  • 空间复杂度:O(1) 或 O(n),取决于使用的语言中字符串类型的性质。如果字符串是可修改的,那么我们可以直接在原字符串上修改,空间复杂度为 O(1),否则需要使用 O(n) 的空间将字符串临时转换为可以修改的数据结构(例如数组),空间复杂度为 O(n)。