给定一个字符串 s 和一个整数 k,从字符串开头算起,每 2k 个字符反转前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
1 <= s.length <=
s 仅由小写英文组成
1 <= k <=
package com.loo;
public class ReverseString {
public static void main(String[] args) {
String str = "abcdefgh";
String str2 = "abcd";
String str3 = "abcdefghijklmn";
int k = 3;
System.out.println(reverseString(str , k));
System.out.println(reverseString2(str3 , k));
}
// 时间复杂度为 O(n^2) , 空间复杂度 O(n)
public static String reverseString(String str , int k) {
if (str == null || str.length() == 0 || k <=0) {
return str;
}
int length = str.length();
StringBuilder reverse = new StringBuilder();
StringBuilder sb = new StringBuilder();
for (int i=0;i<length;i+=2*k) {
if (i + k <= length) {
for (int j=i;j<i+k;j++) {
reverse.append(str.charAt(j));
}
sb.append(reverse.reverse());
boolean mark = length - (i+2*k) >= 0;
for (int h=i+k;h<(mark ? (i+2*k) : length);h++) {
sb.append(str.charAt(h));
}
reverse.delete(0, reverse.length());
continue;
}
// System.out.println("+++++++++++");
for (int j=i;j<length;j++) {
reverse.append(str.charAt(j));
}
}
return sb.append(reverse.reverse()).toString();
}
// 时间复杂度为 O(n) , 空间复杂度 O(n)
public static String reverseString2(String str , int k) {
if (str == null || str.length() == 0 || k <=0) {
return str;
}
char[] reverse = str.toCharArray();
for (int i=0;i<reverse.length;i+=2*k) {
int m = i;
int n = Math.min(m + k - 1, reverse.length-1);
while (m < n) {
char c = reverse[m];
reverse[m++] = reverse[n];
reverse[n--] = c;
}
}
return new String(reverse);
}
}