代码随想录9——数组9——移除元素4——快慢指针法——比较含退格的字符串

🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文 || 一分钟看完我的上千篇博客

🔥温馨提示:划到文末发现专栏彩蛋   点击这里直接传送

🔥本篇概览:数据结构与算法 || 详细讲解了使用stringBuffer的append()和deleteCharAt()来模拟入出栈的行为,实现退格操作。🌈⭕🔥


【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】


目录

🌈序言

题目:

剖析题干重点:

🔥思路分析:

1.StringBuffer模拟行为

最终代码:

今日问题:

今日总结:

1.String、StringBuffer、StringBuilder的区别

2.一句话总结

3.String和StringBuffer方法总结

4.算法简洁性


🌈序言

算法乃我长久之志也,此关必过。今日得此代码随想录之良品辅助,应按此路学之习之,而长久不可懈怠。

前一系列文章详细讲解了用快慢指针法移动数组元素,建议先将这部分知识掌握之后再来学习本篇内容,点击查看。

🔥 代码随想录——数组8——移除元素3——快慢指针法——将所有0放在最后面去-CSDN博客

🔥 代码随想录系列所有算法精讲一键查阅


题目:

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

示例 1:

输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。

示例 2:

输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 ""。

示例 3:

输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。

剖析题干重点:

这种需要移除的题目,显然快慢指针来重新接收新字符串。


🔥思路分析:

1.StringBuffer模拟行为

——使用栈的思想模拟字符串退格的行为。一遍遍历就行。

快指针一旦接收到了‘#’,慢指针便出栈,否则压栈。注意这里需要判断栈是否为空,否则会报错越界。

还是快慢指针的核心框架,只不过里面的判断逻辑是栈。

这里使用新建一个字符串作为慢指针,使用传入的字符串参数作为快指针进行遍历。

这里注意:

1、使用StringBuffer来新建字符串(因为这样是始终一个对象,可变的。如果使用String便是始终新建对象,不适合。)

2、动作的类比

StringBuffer的append(c)方法作为压栈的动作,StringBuffer的deleteCharAt(length()-1)方法作为出栈的动作。

3、别忘了最后的类型转化。StringBuffer和String是不一样的。

4、可以直接使用String.equal()进行比较字符串是否相等。


最终代码:

class Solution {
    public boolean backspaceCompare(String s, String t) {
     return removeByBackSpace(s).equals(removeByBackSpace(t));

    }

     String removeByBackSpace(String str){
        int length = str.length();
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < length; i++) {
            char c = str.charAt(i);
            if (c!='#'){
                stringBuffer.append(c);

//注意这里要判断是否是是空栈,空了就直接不管#就行,多么简单的逻辑,
自己搞的比较#和字符长度等等越搞越复杂,记住算法是简洁和纯粹的
            }else if (stringBuffer.length()>0){
                stringBuffer.deleteCharAt(stringBuffer.length()-1);
            }
        }
        return stringBuffer.toString();
    }
    
}

今日问题:


今日总结:

1.String、StringBuffer、StringBuilder的区别

StringStringBufferStringBuilder都是 Java 中用于处理字符串的类,但它们之间有一些区别:

  1. 不可变性

    • String对象是不可变的,这意味着一旦创建了一个String对象,就不能修改它的值。如果需要修改String对象的值,就会创建一个新的String对象。
    • StringBufferStringBuilder对象是可变的,这意味着可以修改它们的值而不需要创建新的对象。
  2. 线程安全

    • StringBuffer是线程安全的,这意味着多个线程可以同时访问和修改同一个StringBuffer对象,而不会出现线程安全问题。
    • StringBuilder不是线程安全的,这意味着多个线程不能同时访问和修改同一个StringBuilder对象,否则可能会出现线程安全问题。
  3. 性能

    • 由于String对象是不可变的,因此在进行字符串操作时,需要创建新的String对象,这可能会导致性能问题。
    • StringBufferStringBuilder对象是可变的,因此在进行字符串操作时,不需要创建新的对象,这可以提高性能。
  4. 使用场景

    • 如果需要频繁地修改字符串的值,并且不考虑线程安全问题,那么应该使用StringBuilder
    • 如果需要频繁地修改字符串的值,并且需要考虑线程安全问题,那么应该使用StringBuffer
    • 如果不需要频繁地修改字符串的值,那么应该使用String

2.一句话总结

总之记住一句话:只要记住String和StringBuffer,不变用StringBuffer,变时用String。


3.String和StringBuffer方法总结

1、String的方法总结:

2、StringBuffer方法总结:

(1\不能赋值,如str="1234qwer",只能使用append()方法,str.append("1234qwer"))

(2\是字符串缓冲区的别称。所谓缓冲区,就是可以改变的。)

4.算法简洁性

注意这里要判断是否是是空栈,空了就直接不管#就行,多么简单的逻辑,
自己搞的比较#和字符长度等等越搞越复杂,记住算法是简洁和纯粹的
            }else if (stringBuffer.length()>0){
                stringBuffer.deleteCharAt(stringBuffer.length()-1);


📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!

👇下面是专栏彩蛋系列,你会喜欢的!(为了避免影响算法的简洁与优美,这里直接将之前的几十个专栏简化为3个部分,不过你点击开后发现惊喜。)👇


💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

热门专栏

🌈🌈专栏彩蛋系列

🌈🌈史上最全八股文,欢迎收藏

🌈🌈一篇文章了解我的上千篇博客

💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖


  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值