字符串反转问题
我们知道反转是链表的一个重要考点,反转同样是字符串的重要问题。字符串和链表在处理反转的方式上有相似的地方,一般都是运用双指针,一个指针从前找,一个指针从后找。具体的处理办法结合下面具体的题目来看:
1、反转字符串
LeetCode344. 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间来解决这一问题。
示例:
输入:s = [“h”, “e”, “l”, “l”, “o”]
输出:[“o”, “l”, “l”, “e”, “h”]
这是最基本的反转问题,也是最简单的问题,使用双指针方法最直接。具体做法是:
- 将left 指向字符数组首元素,right指向字符数组尾元素
- 当left < right时:
- 交换s[left] 和 s[right]
- left指针向右移一位
- right指针向左移一位
- 当left>=right时,反转结束,返回字符数组
具体的java代码如下:
public void reverseString(char[] s) {
if (s == null || s.length() == 0) {
return;
}
int n = s.length;
for (int left = 0, right = n - 1; left < right; left++, right++) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
}
}
2、K个一组反转
LeetCode541. 给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。
- 如果剩余字符少于k个,则将剩余字符全部反转。
- 如果剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
示例1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例2:
输入:s = “abcd”, k = 2
输出:“bacd”
对于这题,只用按照题意来就好了:反转每个下标从2k的倍数开始的,长度为k的子串。若该子串长度不足k,则反转整个子串。
public String reverseStr(String s, int k) {
if (s == null || s.length() == 0) {
return s;
}
int n = s.length();
char[] arr = s.toCharArray();
for (int i = 0; i < n; i += 2 * k) {
reverse(arr, i, Math.min(i + k, n) - 1)

本文详细探讨了字符串反转的不同问题,包括基本反转、K个一组反转、反转字母和单词,以及提供Java代码实现。涉及双指针技巧和Java内置方法的应用。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



