每日一题:Leetcode844 比较含退格的字符串

简介: 每日一题:Leetcode844 比较含退格的字符串

题目描述

给定 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 <= s.length, t.length <= 200
s 和 t 只含有小写字母以及字符 ‘#’


进阶:

你可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?


一、思路

两种思路:使用出栈入栈来进行记录 和 使用双指针(慢指针用来记录新数组索引,快指针用来指向新数组值)

使用栈:

通过对字符串缓冲区内的数条件筛选(此处写法类似于下面那种双指针)进行增添和删除实现入栈和出栈操作,


双指针:写法分为从前到后和从后往前,第二种难于理解,这里我们使用从前往后进行遍历。

本来以为我已经学会使用双指针了,但是看到这道题又让我陷入懵逼了;业精于勤荒于嬉!

首先 慢指针用来记录一个新的数组索引的值,快指针用来确定新数组中的值,然后将是否退格符作为判断标准,如果是退格符的话,那么此时前一个符被清理掉,所以slow–将慢指针回退到上一个索引位置,然后重新去赋值。


二、参考代码

栈操作:

class Solution {
    public boolean backspaceCompare(String s, String t) {
        // 方式一:通过管理栈来做到对目标字符的提取 
        return build(s).equals(build(t));
    }
    public String build(String str){ 
        StringBuffer ret = new StringBuffer();
        for(int i =0;i<str.length();i++){
            char ch = str.charAt(i);
            if(ch != '#'){
        // append() 可以把任意类型数据添加到字符串缓冲区 
                ret.append(ch);
            }else{
       // 首字母为# 也是空需要排除 没意义
                if(ret.length()>0){
       // deleteCharAt() 方法用于移除序列中指定位置的字符
                    ret.deleteCharAt(ret.length()-1);
                }
            }
        }
        return ret.toString();
    }


双指针:

class Solution {
 //     使用经典的双指针法 快慢指针, 快指针指向值,慢指针指向索引
    public static String changeString(String str){
        int slow = 0;
        char [] x= str.toCharArray();
        for(int fast = 0;fast<x.length;fast++){
            if(x[fast] != '#'){
                x[slow++] = x[fast];
            }else{
                if(slow>0 ){
                    slow--;
                }
            }
        }
//         String.valueOf(char[] data, int offset, int count) :
//    将 char 数组 转换成字符串 
        return String.valueOf(x,0,slow);
    }
}


相关文章
|
3月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
40 1
|
3月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
30 9
|
3月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
24 0
|
3月前
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
33 0
|
3月前
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
25 0
|
3月前
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
25 0
|
3月前
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
19 0
|
5月前
|
存储 算法
LeetCode第43题字符串相乘
LeetCode第43题"字符串相乘"的解题方法,通过使用数组存储乘积并处理进位,避免了字符串转换数字的复杂性,提高了算法效率。
LeetCode第43题字符串相乘
|
5月前
|
算法 Java
LeetCode第28题找出字符串中第一个匹配项的下标
这篇文章介绍了LeetCode第28题"找出字符串中第一个匹配项的下标"的两种解法:暴力解法和KMP算法,并解释了KMP算法通过构建前缀表来提高字符串搜索的效率。
LeetCode第28题找出字符串中第一个匹配项的下标
|
5月前
|
算法
LeetCode第8题字符串转换整数 (atoi)
该文章介绍了 LeetCode 第 8 题字符串转换整数 (atoi)的解法,需要对字符串进行格式解析与校验,去除前导空格和处理正负号,通过从高位到低位的计算方式将字符串转换为整数,并处理越界情况。同时总结了这几道题都需要对数字的表示有理解。
LeetCode第8题字符串转换整数 (atoi)