目录
反转字符串II
描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1
输入:s = "abcdefg", k = 2 输出:"bacdfeg"
示例 2
输入:s = "abcd", k = 2 输出:"bacd"
提示
- s 仅由小写英文组成
方法:递归
我们假设数组为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;
}
}