844. 比较含退格的字符串

54 阅读1分钟

题目

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

 

提示:

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

 

进阶:

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

我的答案

var backspaceCompare = function(s, t) {
    function handle(str) {
        let slow = 0;
        for (let fast = 0; fast < str.length; fast++) {
            if (str[fast] != '#') {
                str[slow++] = str[fast] //错误点A
            } else {
                    slow--; //错误点B
            }
        }

        return str.slice(0, slow)  //错误点C
    }
   return (handle(s) === handle(t))
    
};

分析错误点

  1. str[slow++] = str[fast] //错误点A
    字符串在 JavaScript 中是不可变的,因此不能直接修改字符串的字符。可以使用一个数组来存储结果,然后在最后将数组转换回字符串
  2. slow--; //错误点B
    但是在处理 # 时,需要确保 slow 不会变成负数。否则,当 slow 变成负数时,数组索引会变得无效。
  3. eturn str.slice(0, slow) //错误点C
    在处理 # 时,slow 可能会减少,导致 result 数组中有一些无效的字符

修改后的正确答案

var backspaceCompare = function(s, t) {
    function handle(str) {
        let slow = 0;
        let result = []
        for (let fast = 0; fast < str.length; fast++) {
            if (str[fast] != '#') {
                result[slow++] = str[fast]
            } else {
                 if (slow > 0) {
                    slow--;
                }
            }
        }

        return result.slice(0, slow).join('')
    }
   return (handle(s) === handle(t))
    
};