反转字符串2 | LeetCode-541 | 双指针 | 分类讨论

这个题目除了分类讨论就没什么了

LeetCode链接:541. 反转字符串 II

1.题目描述

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

1
2
输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

1
2
输入:s = "abcd", k = 2
输出:"bacd"

提示:

  • $1 <= s.length <= 10^4$
  • s 仅由小写英文组成
  • $1 <= k <= 10^4$

2.题解

2.1 直接法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class Solution {
public String reverseStr(String s, int k) {
// 将字符串转换为字符数组,方便操作
char[] chs = s.toCharArray();
// 计算完整的2k段的数量
int count = chs.length / (2 * k);
// 逐段反转每个完整的k个字符
for (int i = 0; i < count; i++) {
reverseStr(chs, 2 * i * k, 2 * i * k + k - 1);
}

// 处理剩余的字符
int mod = chs.length % (2 * k);
// 如果剩余的字符数大于或等于k,反转前k个字符
if (mod >= k) {
reverseStr(chs, 2 * count * k, 2 * count * k + k - 1);
} else {
// 如果剩余的字符数小于k,反转所有剩余的字符
reverseStr(chs, 2 * count * k, chs.length - 1);
}

// 将字符数组转换回字符串并返回
return new String(chs);
}

// 反转字符数组指定范围内的字符
public void reverseStr(char[] chs, int begin, int end) {
while (begin < end) {
// 暂存末尾字符
char c = chs[end];
// 将开头字符赋值给末尾位置,同时末尾索引向前移动
chs[end--] = chs[begin];
// 将暂存的末尾字符赋值给开头位置,同时开头索引向后移动
chs[begin++] = c;
}
}
}

2.2 双指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public String reverseStr(String s, int k) {
// 将字符串转换为字符数组,方便对字符串进行操作
char[] chs = s.toCharArray();
// 初始化开始位置指针
int begin = 0, end;

// 逐段处理字符数组
while (begin < chs.length) {
// 计算剩余字符的长度
int reaminLen = chs.length - begin;
// 确定本段反转的结束位置
end = reaminLen >= k ? begin + k - 1 : chs.length - 1;
// 反转从begin到end的字符
reverseStr(chs, begin, end);
// 将起始位置指针向后移动2k位置
begin += 2 * k;
}

// 将字符数组转换回字符串并返回
return new String(chs);
}

// 反转字符数组中指定范围内的字符
public void reverseStr(char[] chs, int begin, int end) {
while (begin < end) {
// 暂存末尾字符
char c = chs[end];
// 将开头字符赋值给末尾位置,同时末尾索引向前移动
chs[end--] = chs[begin];
// 将暂存的末尾字符赋值给开头位置,同时开头索引向后移动
chs[begin++] = c;
}
}
}
-------------本文结束感谢您的阅读-------------