LeetCode 算法:比较含退格的字符串

61 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 13 天,点击查看活动详情

比较含退格的字符串

原题地址

给定 st 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 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"

提示:

  • 1 <= s.length, t.length <= 200
  • st 只含有小写字母以及字符 '#'  

进阶:

  • 你可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?

思路分析

方法一

  1. 定义一个方法 getStr 来获取字符串经历过退格以后得到的最终结果;
  2. getStr 方法中,可以定义一个变量 res 来存储字符串的变化过程,于是我们开始遍历字符串,若遇到 "#",那么将 res 的最后一个字符删掉并且赋值给 res,此时要注意 res 为空的情况,为空时,退格后还是空字符串;若遇到 非“#”,则可以将该字符追加到 res 上。最后返回 res
  3. 使用 getStr 方法针对 st 计算最后的结果 s1t1,然后比较 s1t1 是否相同。

方法二

  1. 可以使用栈来存储经过退格后的字符串结果;
  2. 同样,需要遍历 st,若遇到 “#” 则进行出栈,也就是执行 res.pop() 方法,若是其他字符,则进行入栈操作,也就是执行 res.push() 方法;
  3. 得到的栈进行每个栈顶的比较,若不同则返回 false,若循环后没有得出结果,则查看剩下的栈长度是否相同,若相同则返回 true,否则为 false
  4. 步骤三的判断 也可以使用 res1.join('') === res2.join('') 来判断。

AC 代码

方法一

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    const s1 = getStr(s)
    const t1 = getStr(t)
    return s1 === t1
};

var getStr = function (str) {
    let res = ''
    for(let i = 0; i < str.length; i++) {
        if(str[i] === '#') {
            res = res.length === 0 ? '' : res.substr(0, res.length - 1)
        } else {
            res += str[i]
        }
    }
    return res
}

结果:

  • 执行结果: 通过
  • 执行用时:76 ms, 在所有 JavaScript 提交中击败了10.71%的用户
  • 内存消耗:43 MB, 在所有 JavaScript 提交中击败了6.05%的用户
  • 通过测试用例:114 / 114

方法二

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    const res1 = []
    for (const c of s) {
        if (c === '#') res1.pop()
        else res1.push(c)
    }
    const res2 = [];
    for (const c of t) {
        if (c === '#') res2.pop()
        else res2.push(c)
    }
    while (res1.length !== 0 && res2.length !== 0) {
        if (res1.pop() !== res2.pop()) return false
    }
    return res1.length === res2.length
}

结果:

  • 执行结果: 通过
  • 执行用时:68 ms, 在所有 JavaScript 提交中击败了35.79%的用户
  • 内存消耗:41.9 MB, 在所有 JavaScript 提交中击败了24.58%的用户
  • 通过测试用例:114 / 114

END