给定 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"。
题解 :
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
// 方法一:双指针
var backspaceCompare = function (s, t) {
let i = s.length - 1, j = t.length - 1, skipS = 0, skipT = 0;
while (i >= 0 || j >= 0) {
// 对s 做循环
while (i >= 0) {
// 当遇到 ‘#’ 时 skipS记录
if (s[i] === '#') {
skipS++
i--
} else if (skipS > 0) { // 当没有遇到 ‘#’ 时 并且skipS大于0 时过滤到掉前数
skipS--;
i--
} else {
break
}
}
// 对t 做循环
while (j >= 0) {
// 当遇到 ‘#’ 时 skipS记录
if (t[j] === '#') {
skipT++
j--
} else if (skipT > 0) {// 当没有遇到 ‘#’ 时 并且skipS大于0 时过滤到掉前数
skipT--;
j--
} else {
break
}
}
// 判断如果两个数不相等
if (s[i] !== t[j]) return false;
i --
j --
}
return true
};
// 方法二:栈结构
var backspaceCompare = function (s, t) {
const stackS = [], stackT = []
// 遍历s 遇到‘#’出栈,没遇到入栈
for (let ca of s) {
if (ca === '#') {
stackS.pop()
} else {
stackS.push(ca)
}
}
// 遍历t 遇到‘#’出栈,没遇到入栈
for (let ca of t) {
if (ca === '#') {
stackT.pop()
} else {
stackT.push(ca)
}
}
// 对比两条入栈清理‘#’后的数据
while (stackS.length && stackT.length) {
if (stackS.pop() !== stackT.pop()) return false
}
// 如果出站后都相等,判断长度是否相等
return stackS.length == stackT.length ? true : false
}
来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。