数据结构与算法之LeetCode 844. 比较含退格的字符串

844. 比较含退格的字符串
使用栈

考虑题目要求遇到退格符号,就会删除前一个字符,一般想法是在下一个数字是退格符号时,将前一个符号从字符串中删除,这个时候想到可以使用栈这个结构来保存字符串。

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    return build(s)==build(t);
};

var build = function(str){
    let result = [];
    for(let i=0;i<str.length;++i){
        let s = str.charAt(i);
        if(s!='#'){
            result.push(s);
        }else{
            if(result.length>0){
                result.pop();
            }
        }
    }
    return result.join('');
}
结果

执行结果:通过
执行用时:60 ms, 在所有 JavaScript 提交中击败了99.14%的用户
内存消耗:38 MB, 在所有 JavaScript 提交中击败了74.68%的用户
通过测试用例: 113 / 113

双指针解法

因为退格符号时从删除前面的数字,因此对左边的字符没有影响,因此考虑则从后遍历

思路:
1.准备两个指针i,j分别指向两个字符串的末尾,同时使用两个变量si,sj存储两个字符串中的退格符号数量
2.从后往前遍历字符串:
a:当前字符是退格符号#,则si++;
b:当前字符不是退格符号#,同时si不为0,则si–
c:当前字符串不是退格符号,同时si为0,则代表当前字符不会被删除,使用另外一个字符串来做比较
如果对比过程中出现字符串不匹配,则结束遍历返回false,如果两个都遍历结束,且能一一匹配,则返回true

var backspaceCompare = function(s,t){
    let i=s.length-1,j=t.length-1,si=0,sj=0;

    while(i>=0||j>=0){
        // string s circular
        while(i>=0){
            if(s[i]==='#'){
                si++;
                i--;
            }else if(si>0){
                si--;
                i--;
            }else{
                break;
            }
        }

        // string t circular
        while(j>=0){
            if(t[j]==='#'){
                sj++;
                j--;
            }else if(sj>0){
                sj--;
                j--;
            }else{
                break;
            }
        }

        if(s[i]!==t[j]) return false;
        i--;
        j--;
    }
    return true;
}
结果

执行结果: 通过
执行用时:76 ms, 在所有 JavaScript 提交中击败了47.49%的用户
内存消耗:37.6 MB, 在所有 JavaScript 提交中击败了 98.49%的用户
通过测试用例:113 / 113

参考

1.比较含退格的字符串
2.双指针 比较含退格的字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值