字符串算法题(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"

提示

  • 1 \le s.length \le 10^4
  • s 仅由小写英文组成
  • 1 \le k \le 10^4

方法:递归

我们假设数组为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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值