[路飞]_leetcode刷题_844. 比较含退格的字符串

197 阅读1分钟

题目

844. 比较含退格的字符串

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,请你判断二者是否相等。# 代表退格字符。

如果相等,返回 true ;否则,返回 false 。

注意:如果对空文本输入退格字符,文本继续为空。

思路1:

这题首先想到的就是用栈数据结构来解决,用栈去分别处理两个字符串,比较处理后的结果。

处理的过程:遇到字符,则入栈,遇到#,则出栈。

代码如下:

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    let stack_s = [];
    let stack_t = [];
    for(let i=0;i<s.length;i++){
        if(s[i]!='#'){
            stack_s.push(s[i])
        }else{
            stack_s.pop()
        }
    }
    for(let i=0;i<t.length;i++){
        if(t[i]!='#'){
            stack_t.push(t[i])
        }else{
            stack_t.pop()
        }
    }
    return stack_s.join('') == stack_t.join('')
};

思路2:

也可以用双指针的方法去做,申明两个指针ps和pt,分别指向两个字符串的末尾,申明两个变量,用于记录遇到'#'后,该删除的字符串的数量,分别为ds和dt

  1. 如果指针位置是'#',则指针向前走一格ps--,并且记录待删除长度ds++
  2. 如果指针位置是字符,并且待删除长度ds>0,则指针向前走以为ps--,待删除长度ds--
  3. 如果指针位置是字符,且待删除长度为0,则将这个字符拿去比较

代码如下:

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    let ps=s.length-1,pt=t.length-1;
    let ds = 0,dt = 0;
    
    while(ps>=0 || pt>=0){
        while(ps>=0){
            if(s[ps] == '#'){
                ps--;
                ds++;
            }else if(ds>0){
                ps--;
                ds--;
            }else{
                break
            }
        }
        while(pt>=0){
            if(t[pt] == '#'){
                pt--;
                dt++;
            }else if(dt>0){
                pt--;
                dt--;
            }else{
                break
            }
        }
        if(s[ps] != t[pt]){
            return false
        }
        ps--;
        pt--;
    }
    return true
};