携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 13 天,点击查看活动详情
比较含退格的字符串
原题地址
给定 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 <= 200s和t只含有小写字母以及字符'#'
进阶:
- 你可以用
O(n)的时间复杂度和O(1)的空间复杂度解决该问题吗?
思路分析
方法一
- 定义一个方法
getStr来获取字符串经历过退格以后得到的最终结果; - 在
getStr方法中,可以定义一个变量res来存储字符串的变化过程,于是我们开始遍历字符串,若遇到"#",那么将res的最后一个字符删掉并且赋值给res,此时要注意res为空的情况,为空时,退格后还是空字符串;若遇到非“#”,则可以将该字符追加到res上。最后返回res。 - 使用
getStr方法针对s和t计算最后的结果s1和t1,然后比较s1和t1是否相同。
方法二
- 可以使用栈来存储经过退格后的字符串结果;
- 同样,需要遍历
s和t,若遇到“#”则进行出栈,也就是执行res.pop()方法,若是其他字符,则进行入栈操作,也就是执行res.push()方法; - 得到的栈进行每个栈顶的比较,若不同则返回
false,若循环后没有得出结果,则查看剩下的栈长度是否相同,若相同则返回true,否则为false; - 步骤三的判断 也可以使用
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