884.比较含退格的字符串

给定 st 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 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.使用栈

可以使用栈,当遇到#时,弹出栈顶元素,最后比较两个栈是否相同,但是最后比较的时候还需要把栈里的数据取出来再比较,比较麻烦,可以直接将给定的字符串作为栈,后面比较会比较简单

2.使用双指针

使用双指针,分别从两个字符串的最后一个位置往前遍历,再引入两个变量记录两个字符串各自需要退格的数量,如果退格的数量用完了,那么就比较当前位置是否相同,不同的话就返回false,相同的话继续往前遍历

实现

1.字符串模拟栈

class Solution {
    public boolean backspaceCompare(String S, String T) {
        return sb(S).equals(sb(T));
    }
    public String sb(String s){
        StringBuilder sb = new StringBuilder();
        char[] arr  = s.toCharArray();
        for(int i = 0;i<arr.length;i++){
            if(arr[i]!='#'){
                sb.append(arr[i]);
            }else{
                if(sb.length()>0){
                    sb.deleteCharAt(sb.length()-1);
                }
            }
        }
        return sb.toString();
    }
}

2.双指针

class Solution {
    public boolean backspaceCompare(String S, String T) {
        int slen = S.length()-1,tlen = T.length()-1;
        int s = 0,t = 0;
        while(slen>=0||tlen>=0){
            while(slen>=0){
                if(S.charAt(slen)=='#'){
                    s++;slen--;
                }else if(s>0){
                    s--;slen--;
                }else{
                    break;
                }
            }
            while(tlen>=0){
                if(T.charAt(tlen)=='#'){
                    t++;tlen--;
                }else if(t>0){
                    t--;tlen--;
                }else{
                    break;
                }
            }
            if(slen>=0&&tlen>=0){
                if(S.charAt(slen)!=T.charAt(tlen)){
                    return false;
                }
            }else{
                if(slen>=0||tlen>=0){
                    return false;
                }
            }
            slen--;
            tlen--;
        }
        return true;
    }
}

每个不起眼的日子,都是反败为胜的资本