LeetCode —— 844. 比较含退格的字符串

94 阅读2分钟

启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

该题是数组移除元素题型第四题。

题目来源

844. 比较含退格的字符串 - 力扣(LeetCode)

题目描述(简单

给定 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<=2001 <= s.length, t.length <= 200
  • s 和 t 只含有小写字母以及字符 '#'

题目解析

该题可以理解为,字符串中小写字母代表键盘上的 字母 键,字符 # 代表键盘上的 delete 键,在文本中,按照字符串进行按键,最后得到一个字符串的结果。将两个字符串的结果进行比较,相等返回 true ,反之,返回 false

双指针

为了操作方便,可以将字符串转为数组元素。

首先明确,快慢指针的用处:

  • 慢指针:返回结果的长度
  • 快指针:遍历字符串数组,找到字符 #

注意: 当慢指针 slow0 时,此时遇到字符 #slow 应为 0 ,而不是 -1slice() 方法返回一个原数组区间为 [begin, end) 新数组。

详情可以参考:Array.prototype.slice() - JavaScript | MDN (mozilla.org)

代码

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    return textScanner(s) === textScanner(t)
};

var textScanner = function(string) {
    let slow = 0, fast = 0, text = string.split('')
    while (fast < text.length) {
        if (text[fast] === '#'){
            slow = slow ? slow - 1 : 0
            fast++
        }else {
            text[slow] = text[fast]
            fast++
            slow++
        }
    }
    return text.slice(0,slow).join('')
}
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

如图:

image.png

重构字符串

该题也可以理解为一个出栈和入栈的过程,当遍历到字符 # 时,便是出栈,反之,便是入栈。

在模拟栈处理中,该方法采用 数组 作为栈存储, push()pop() 方法模拟入出栈。

代码

/**
 * @param {string} s
 * @param {string} t
 * @return {boolean}
 */
var backspaceCompare = function(s, t) {
    return textScanner(s) === textScanner(t)
};

var textScanner = function(string) {
    let text = []
    for (const charts of string) {
        if (charts !== '#') {
            text.push(charts)
        }else {
            text.pop()
        }
    }
    return text.join('')
}
  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(1)O(1)

如图:

image.png

执行用时和内存消耗仅供参考,大家可以多提交几次。如有更好的想法,欢迎大家提出。