[路飞]_比较含退格的字符串

137 阅读1分钟

题目介绍

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

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

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

示例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 = "#a#c"
输出: true
解释: s 和 t 都会变成 “c”。

示例4

输入: s = "a#c", t = "b"
输出: false
解释: s 会变成 “c”,但 t 仍然是 “b”。

提示:

解题思路

思路一:栈

遍历字符串的每一个字母,如果该位置不是 ‘#’,那么将该位置的字母入栈,否则我们将栈顶元素弹出

对两个字符串 s 和 t 都进行如上操作之后,重新将两个栈中的字母合并为字符串,比较这两个字符串是否相等

2.gif

解题代码

var backspaceCompare = function(s, t) {
    const stackS = [], stackT = []
    for (let i = 0; i < s.length; i++) {
        switch (s[i]) {
            case '#': 
                stackS.pop()
                break
            default:
                stackS.push(s[i])
        }
    }
    for (let i = 0; i < t.length; i++) {
        switch (t[i]) {
            case '#': 
                stackT.pop()
                break
            default:
                stackT.push(t[i])
        }
    }
    return stackS.join('') === stackT.join('')
};

思路二:标记法

从题目和示例我们可以看出,有多少个 ‘#’,就必须抵消掉 ‘#’ 前面多少个字母(如果字母的数量足够的话)

抵消之后的字符串如果相同,那么相同位置上的字母一定相同

我们可以通过判断抵消之后相同位置上的字母是否相同来提前结束循环操作

  1. 使用 signS 和 signT 分别记录 s 和 t 当前遍历到的 ‘#’ 数量
  2. 分别从 s 和 t 的尾部字母开始,如果遇到 ‘#’,标志 ‘#’ 数量加 1
  3. 如果遇到字母,判断标志位是否为 0, 如果不为 0,说明当前字母是必须被抵消的,那么继续往前走
  4. 当遇到字母时,标志位也为 0,此时我们可以比较 s 和 t 该位置的字母是否相同,如果不相同,说明最后的结果肯定也不相同,直接返回 false,结束循环,否则,指针继续往前走
  5. 重复 2-4,直到遍历完两个字符串

3.gif

解题代码

var backspaceCompare = function(s, t) {
    let signS = 0, signT = 0, i = s.length - 1, j = t.length - 1
    while (i >= 0 || j >= 0) {
        while (i >= 0) {
            if (s[i] === '#') {
                signS++
                i--
            } else if (signS) {
                signS--
                i--
            } else {
                break
            }
        }
        while (j >= 0) {
            if (t[j] === '#') {
                signT++
                j--
            } else if (signT) {
                signT--
                j--
            } else {
                break
            }
        }
        if (s[i] !== t[j]) return false
        i--
        j--
    } 
    return true
};

以上就是本题的两种解决方案