比较含退格的字符串

95 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

题目描述

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

思路分析

从题目知道#只会删除左边字母,对右边的字母毫无影响,所以,我们可以从右边开始循环,记录下#出现的次数,根据#的次数来消除左边的字母;这里需要三个循环,大循环包含着两个小循环,大循环是用来判断两个目标是否相等的;两个字符串需要分开循环,所以需要两个小循环;从右往左循环的时候,判断当前字符时#时,numS自增1;若当前字符不是#并且num不是0,那么numS减1;若当前的字母不是#并且numS是0,那么我们就可以用它和另一个字符串的当前字母作比较;若是在循环比较中两个字符串的当前字母不相等,则直接return false并结束循环;若是等循环结束后,每个循环时的当前字母都能一一匹配,那么就返回true。

AC代码

function equals(S, T) {
    let i = S.length - 1,
        j = T.length - 1,
        numS = 0,
        numT = 0;
    while(i >= 0 || j >= 0){
        while(i >= 0){
            if(S[i] === '#'){
                numS++;
                i--;
            }else if(numS > 0){
                numS--;
                i--;
            }else break;
        }
        while(j >= 0){
            if(T[j] === '#'){
                numT++;
                j--;
            }else if(numT > 0){
                numT--;
                j--;
            }else break;
        }
        if(S[i] !== T[j]) return false;
        i--;
        j--;
    }
    return true;
};

总结

这道题主要需要从右边开始循环起,若是循环到#并存好数量,这就接下来遇到字符就根据#的数量删除字符。