字符串算法题(2)反转字符串II

目录

反转字符串II

描述

示例 1

示例 2

提示

方法:递归


反转字符串II

描述

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

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

示例 1

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

示例 2

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

提示

  • 字符串算法题(2)反转字符串II
  • s 仅由小写英文组成
  • 字符串算法题(2)反转字符串II

方法:递归

我们假设数组为arr,每次处理区间[low,high)之间的元素,然后更新low=low+2k, high=high+2k。

首先我们从区间[0,k)开始处理(此时low=0,high=k),处理的规则如下:

  • low>=arr.length,则越界了,直接返回
  • low<arr.length&&high<=arr.length,则将[low,high)区间内的元素反转,并递归处理[low+2k,high+2k)
  • low<arr.length&&high>arr.length,则将[low,arr.length)区间内的元素反转,并结束递归
class Solution {
    public String reverseStr(String s, int k) {
        char[] reverse = reverse(s.toCharArray(), 0, k);
         return new String(reverse);
    }

    public char[] reverse(char[] arr, int low, int high){
        if (low>=arr.length) return arr;//如果越界了直接返回
        else if (high<=arr.length){//对s[low,high)之间的字符进行反转
            for (int i = low; i < (high+low)/2; i++) {
                char temp=arr[i];
                arr[i]=arr[high-(i-low+1)];
                arr[high-(i-low+1)]=temp;
            }
            int k=high-low;
            arr=reverse(arr,low+2*k,high+2*k);//对下一组进行反转
        }else{//对s[low,len)之间的字符进行反转,之后就结束
            for (int i = low; i < (arr.length+low)/2; i++) {
                char temp=arr[i];
                arr[i]=arr[arr.length-(i-low+1)];
                arr[arr.length-(i-low+1)]=temp;
            }
        }
        return arr;
    }
}

字符串算法题(2)反转字符串II

上一篇:强连通分量 -- 割点(割顶)


下一篇:八大排序-上次看到这么好的排序博客还是在上次