启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
该题是数组移除元素题型第四题。
题目来源
题目描述(简单)
给定 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"。
提示
s和t只含有小写字母以及字符'#'
题目解析
该题可以理解为,字符串中小写字母代表键盘上的 字母 键,字符 # 代表键盘上的 delete 键,在文本中,按照字符串进行按键,最后得到一个字符串的结果。将两个字符串的结果进行比较,相等返回 true ,反之,返回 false 。
双指针
为了操作方便,可以将字符串转为数组元素。
首先明确,快慢指针的用处:
- 慢指针:返回结果的长度
- 快指针:遍历字符串数组,找到字符
#
注意: 当慢指针 slow 为 0 时,此时遇到字符 # , slow 应为 0 ,而不是 -1 。 slice() 方法返回一个原数组区间为 [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('')
}
- 时间复杂度:
- 空间复杂度:
如图:
重构字符串
该题也可以理解为一个出栈和入栈的过程,当遍历到字符 # 时,便是出栈,反之,便是入栈。
在模拟栈处理中,该方法采用 数组 作为栈存储, 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('')
}
- 时间复杂度:
- 空间复杂度:
如图:
执行用时和内存消耗仅供参考,大家可以多提交几次。如有更好的想法,欢迎大家提出。