9--844. 比较含退格的字符串

发布时间 2023-11-15 18:47:54作者: 翻斗花园小美Q

给定 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"。

【看完题解之后我的疑惑:也没有把字符串删除啊】
【然后反应过来,s和t的比较是同步进行的,并不用移除,同一下标下的字符相等即可】
【本题的解法是在记录偏移量】
【为什么选择从后往前遍历呢?因为 # 号只会消除左边的一个字符,所以对右边的字符无影响,所以我们选择从后往前遍历s、t字符串
class Solution {
    public boolean backspaceCompare(String s, String t) {
        int i = s.length() - 1;
        int j = t.length() - 1;
        int skipS = 0, skipT = 0;

        while (i >= 0 || j >= 0) {

            // s循环
            // i 从最后一个元素开始,如果此指针指向的元素为“#“,那么skipS的值加一,再接着判断skipS的值是否大于0;
            //如果大于零,则要消灭”#“,那么就skipS--,并且i--;通过循环回退同等数量的字符
            while (i >= 0) {
                if (s.charAt(i) == '#'){
                    skipS++;
                    i--; //此i--是从'#'字符指向下一个
                } else if (skipS > 0) {
                    skipS--;
                    i--; //此i--是因为skipS > 0 ;执行回退操作
                }else {
                    break;  //当此位置上的字符不是” # ”且skipS为0(即并没有扫描到#还),直接跳出此循环
                }
            }

            //T循环
            while (j >= 0) {
                if (t.charAt(j) == '#') {
                    skipT++;
                    j--;
                }else if (skipT > 0){
                    skipT--;
                    j--;                
                }else {
                    break;
                }

                      
            }
            // if (i >= 0 && j >= 0){
            //     if (s.charAt(i) == t.charAt(j)){
            //         return true;
            //     } 
            // } else {
            //         return false;
            //     }

            //为什么这个逻辑就是对的,换成相等的就是不对啊
            if (i >= 0 && j >= 0) {
                if (s.charAt(i) != t.charAt(j)){
                    return false;
                }
            } else {
                if (i>= 0 || j>= 0) {
                    return false;
                }
            }
            i--;
            j--;
        } 
        return true;  
    
    }
}
   

 【再问(改进版)

 if (i >= 0 && j >= 0){
                if (s.charAt(i) != t.charAt(j)){
                    return false;
                }
                //?? 加上下面这些逻辑不是一样的吗  为什么加上了就是不对啊
                // } else {
                //     return true;
                // }
            } else {
                if (i>= 0 || j>= 0) {
                    return false;
                }
            }

            //为什么这个逻辑就是对的,换成相等的就是不对啊
            // if (i >= 0 && j >= 0) {
            //     if (s.charAt(i) != t.charAt(j)){
            //         return false;
            //     }
            // } else {
            //     if (i>= 0 || j>= 0) {
            //         return false;
            //     }
            // }