题目地址(541. 反转字符串 II)
https://leetcode-cn.com/problems/reverse-string-ii/
题目描述
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
提示:
该字符串只包含小写英文字母。
给定字符串的长度和 k 在 [1, 10000] 范围内。
前置知识
- Java中数组的复制方法
思路
- 其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
因为要找的也就是每2 * k 区间的起点,这样写程序会高效很多
关键点
代码
- 语言支持:Java
Java Code:
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i += k * 2) {
if (i + k <= ch.length) {
reverse(ch, i, i + k -1);
continue;
} else {
reverse(ch, i, ch.length - 1);
}
}
String str = new String(ch);
return str;
}
public void reverse(char[] ch, int i, int j) {
char temp;
while (i < j) {
temp = ch[i];
ch[i] = ch[j];
ch[j] = temp;
i++;
j--;
}
}
}
复杂度分析
令 n 为数组长度。
里面while应该跟k有关系,外面start由for循环决定,里面的while循环,间隔<=k,由题目可知,k就是一个常数,范围题目也给定了,所以while时间复杂度可视为O(1),所以总的时间复杂度为O(n)
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)