Leecode刷题笔记之双指针

844. 比较含退格的字符串

题目链接:https://leetcode.cn/problems/backspace-string-compare/

题目分析

刚看到题目想到的是用栈,遇到字符入栈,然后遇到’#‘弹出栈顶元素,最后根据情况比较栈中剩余元素。Java中可以直接使用StringBuffer来模拟栈。这种方法就不过多赘述了。
下面介绍的是双指针的方法。我比较菜,一开始没想出来怎么用双指针实现。然后看了下题解,整理一下思路。
因为’#'只会删除前面一个字符,并不会对后面的字符产生影响,所以选择从后向前遍历字符。代码中加了详细注释就不在这赘述了。值得注意的是最后一个else,p、q是用来循环两个字符串,如果当其中一个字符串循环到头了,但是另一个字符串还没有成空串,那就是不相等的情况,返回false。

class Solution {
    public boolean backspaceCompare(String s, String t) {
        int p = s.length() - 1, q = t.length() -1;
        int skipS = 0,skipT = 0;

        //大循环,用来判断字符串是否遍历完毕
        while(p >= 0 || q >= 0){
            //循环s,直到未被删除的第一个
            while(p >= 0){
                if(s.charat(p) == '#'){
                    skipS++;
                    p--;
                }else if(skipS > 0){
                    //此时说明当前值不是“#”,但是#个数大于0,所以当前值需要被删除
                    skipS--;
                    p--;
                }else{
                    //如果不是上面两种情况,就说明当前值需要和t中当前值比较是否相等
                    break;
                }
            }
            //循环t
             while(q >= 0){
                if(t.charat(q) == '#'){
                    skipT++;
                    q--;
                }else if(skipT > 0){
                    //此时说明当前值不是“#”,但是#个数大于0,所以当前值需要被删除
                    skipT--;
                    q--;
                }else{
                    //如果不是上面两种情况,就说明当前值需要和t中当前值比较是否相等
                    break;
                }
            }
            //比较p和q的当前值
            if(p >= 0 && q >= 0){
                if(s.charat(p) != t.charat(q)){
                    return false;
                }
            }else {
                //如果有一个坐标<0就说明字符被删完了,返回false
                if (p >= 0 || q >= 0) {
                    return false;
                }
            }
            p--;
            q--;
        }
        return true;
    }
}

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...