算法通关村——字符串反转问题解析

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

字符串反转问题

我们知道反转是链表的一个重要考点,反转同样是字符串的重要问题。字符串和链表在处理反转的方式上有相似的地方,一般都是运用双指针,一个指针从前找,一个指针从后找。具体的处理办法结合下面具体的题目来看:

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)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Molche

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值