方法一
class Solution {
public String reverseStr(String s, int k) {
char[] chars = s.toCharArray();
for(int i = 0; i< chars.length; i += 2*k){
int start = i;
int end = Math.min(i+k, chars.length)-1;
while(start < end){
char temp = chars[end];
chars[end] = chars[start];
chars[start] = temp;
start++;
end--;
}
}
return String.valueOf(chars);
}
}
参考了题解,思路是以 2*k 的长度遍历
两个指针指向该次 2*k 个字符区间的第一个元素和第 k 个元素,如果 i+k 大于数组长度则令 end 等于数组长度,反转 [start, end] 区间的字符,然后继续遍历
- 时间复杂度:O(n)
- 空间复杂度:O(n)
方法二
class Solution {
public String reverseStr(String s, int k) {
StringBuilder sb = new StringBuilder();
for(int i = 0; i< s.length(); i += 2*k){
int start = i;
int end = Math.min(i+k, s.length());
StringBuilder temp = new StringBuilder();
temp.append(s.substring(start, end));
temp.reverse();
start = end;
end = Math.min(i+2*k, s.length());
sb.append(temp);
sb.append(s.substring(start, end));
}
return sb.toString();
}
}
思路是差不多的,不过这里用到了 StringBuilder,要注意边界值的取值
- 时间复杂度:O(n)
- 空间复杂度:O(n)
方法三
class Solution {
public String reverseStr(String s, int k) {
StringBuilder sb = new StringBuilder();
int start = 0;
int len = s.length();
while(start < len){
int end = Math.min(start+k, len);
StringBuilder temp = new StringBuilder();
temp.append(s.substring(start, end));
if((start / k) % 2 == 0){
temp.reverse();
sb.append(temp);
} else{
sb.append(temp);
}
start = end;
}
return sb.toString();
}
}
参考了题解,思路跟上面一样,但写法更优雅
- 时间复杂度:O(n)
- 空间复杂度:O(n)