【字符串专题】—— 反转字符串

这篇博客详细介绍了LeetCode上的两道字符串反转题目,包括基本的反转字符串和指定步长反转。解题思路涉及使用双指针和字符数组进行反转操作,并讨论了不同边界条件的处理方法。对于字符串反转,使用字符数组通常比StringBuffer更高效。文章还强调了在处理边界问题时的技巧。
摘要由CSDN通过智能技术生成

LeetCode 344: 反转字符串

在这里插入图片描述
⭕️ 解题思路:
(1)字符串类型题中比较基础的题型,可以利用Java中自带的一些类函数直接完成反转
(2)此处通过创建双指针,遍历字符串数组,然后创建一个临时变量,完成对应位置的字符交换

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;
            left++;
            right--;
        }
    }
}

LeetCode 541: 反转字符串 II

在这里插入图片描述
⭕️ 解题思路:
(1)先对出先的几种情况分析:

//以下默认字符串的长度为len

  • len <= k时,反转整个字符串
  • k < len <= 2*k时,先反转前 k 个,再考虑后面的剩余部分子串

(2)设计一个交换对应字符的方法,有两种方法

  • 通过StringBuffer类来完成子串的反转
public static StringBuffer reversePart(StringBuffer sb, int l, int r){
        while(l < r){
            char temp = sb.charAt(l);
            sb.setCharAt(l, sb.charAt(r));
            sb.setCharAt(r, temp);
            l++;
            r--;
        }
        return sb;
    }
  • 通过字符串数组来完成子串的反转
  • 字符串转化为字符数组: char [] ch = str.toCharArray();
public static void reversePart(char [] ch, int l, int r){
        while(l < r){
            char temp = ch[l];
            ch[l] = ch[r];
            ch[r] = temp;
            l++;
            r--;
        }
    }

通过运行测试发现,利用字符数组来完成字符串的反转会更快一些。

(3)本题的重点在于如何处理这个不同的边界问题。

通过for遍历字符串,传进的左边界为 i,有边界为 i + k 与 len中的那个小的值减一,每次循环控制 i += 2*k

class Solution {
	public String reverseStr(String s, int k) {
        char [] ch = s.toCharArray();
        int len = s.length();
        for(int i = 0; i < len; i += 2 * k){
            reversePart(ch, i, Math.min(i + k, len) - 1);
        }
        return new String(ch);
    }
    public static void reversePart(char [] ch, int l, int r){
        while(l < r){
            char temp = ch[l];
            ch[l] = ch[r];
            ch[r] = temp;
            l++;
            r--;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bow.贾斯汀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值