这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战
541. 反转字符串 II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每 2k 个字符反转前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2 输出:"bacdfeg" 示例 2:
输入:s = "abcd", k = 2 输出:"bacd"
解题思路
题目要求比较简单,就是按照规则反转特定区间的字符串即可。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
对于上述两种情况,我们可以作一个通用的处理
reverse(chars,i,Math.min(s.length()-1,i+k-1));
在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,不需要搞一个计数器,来统计2k,再统计前k个字符
对于剩余字符小于 2k的情况,我们尽量去取翻转k个字符,如果字符个数不足k的,就将剩余字符全部翻转
代码
class Solution {
public void reverse(char[] chars, int l,int r) {
while (l<r)
{
char t=chars[l];
chars[l]=chars[r];
chars[r]=t;
r--;
l++;
}
}
public String reverseStr(String s, int k) {
int i=0;
char[] chars = s.toCharArray();
while (i<chars.length)
{
reverse(chars,i,Math.min(s.length()-1,i+k-1));
i+=2*k;
}
return new String(chars);
}
}
-
时间复杂度:O(n),其中 n 是字符串 s 的长度。
-
空间复杂度:O(1) 或 O(n),取决于使用的语言中字符串类型的性质。如果字符串是可修改的,那么我们可以直接在原字符串上修改,空间复杂度为 O(1),否则需要使用 O(n) 的空间将字符串临时转换为可以修改的数据结构(例如数组),空间复杂度为 O(n)。