【算法系列-字符串】反转字符串
欢迎来到【算法系列】第四弹 🏆 字符串,接下来我们将围绕字符串这类型的算法题进行解析与练习!一起加油吧!!( •̀ ω •́ )✧✨
文章目录
1. 反转字符串(LeetCode 344)
【题目链接】344. 反转字符串 - 力扣(LeetCode)
1.1 思路分析🎯
这道题比较简单,通过双指针的方式解决问题
1.2 解题过程🎬
定义左右指针 left 和 right,left 从 数组起始下标开始,right 从 数组末端开始,通过循环依次交换左右指针所处位置的元素即可
1.3 代码示例🌰
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
while (left < right) {
char temp = s[left];
s[left++] = s[right];
s[right--] = temp;
}
}
}
2. 反转字符串II(LeetCode 541)
【题目链接】541. 反转字符串 II - 力扣(LeetCode)
2.1 思路分析🎯
这道题我们通过 模拟 + 双指针 的方式解决问题,但我们需要先理清楚题目的几个关键要求:
每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符,这句话表示不仅仅只遍历一次2k个字符,当字符串长度存在 n 个 2k 时(n >= 1),仍需要遍历计数2k个字符直到字符串被遍历完
在上述要求下,遍历到 剩余字符串长度小于2k 个字符,才会产生以下两种对剩余字符的操作:
-
如果剩余字符少于 k 个,则将剩余字符全部反转;
-
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样;
2.2 解题过程🎬
通过 for 循环遍历字符数组,每次步长为 i += 2 * k,即每一次对字符数组的 2k 个字符进行操作;
进行判断,当 i + k <= 数组长度时,进行反转,对 2k 个字符的 前k个 字符进行反转,继续循环;
直到 最后一轮遍历,此时的 字符数组长度(right - left) 小于等于 2k,开始对剩余字符进行判断:
当 i + k > arr.length 时,代表剩余字符少于 k 个,则将剩余字符全部反转, 否则表示剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样
2.3 代码示例🌰
class Solution {
public String reverseStr(String s, int k) {
char[] arr = s.toCharArray();
for (int i = 0;i < arr.length;i += 2 * k) {
if (i + k <= arr.length) {
reverse(arr, i, i + k - 1);
continue;
}
reverse(arr, i, arr.length - 1);
}
return String.valueOf(arr);
}
public void reverse(char[] arr, int left, int right) {
while (left < right) {
char temp = arr[left];
arr[left++] = arr[right];
arr[right--] = temp;
}
}
}
以上便是对字符串反转问题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨