题目介绍
给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,请你判断二者是否相等。# 代表退格字符。
如果相等,返回 true ;否则,返回 false 。
注意:如果对空文本输入退格字符,文本继续为空。
示例 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 = "#a#c" 输出:true 解释:s 和 t 都会变成 “c”。 示例 4:
输入:s = "a#c", t = "b" 输出:false 解释:s 会变成 “c”,但 t 仍然是 “b”。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ba… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
解题思路一
普通解法,用栈的思路去解,定义两个栈,如果遇到#就把对应栈出栈,否则入栈,最后判断两个栈是否相等‘
代码
/** * @param {string} s * @param {string} t * @return {boolean} */ var backspaceCompare = function(s, t) { let sArr = [] let tArr = [] let maxLen = Math.max(s.length, t.length) for (let i = 0; i < maxLen; i++) { let si = s[i] let ti = t[i] if(si === '#') { sArr.pop() } else if(si) { sArr.push(si) } if(ti === '#') { tArr.pop() } else if (ti) { tArr.push(ti) } } console.log(sArr, tArr) return sArr.join() === tArr.join() };
解题思路二
用双指针
- 一个字符是否要给删掉取决于该字符串后面#字符串,与前面的#没有关系,所以我们可以从后面开始遍历起
- 分别记录s和t字符的#号符,遇到就加1,否则就减一,同时对应字符串的下标也减一
- 一次循环后先判断两个字符串的下标都大于等于0然后判断对应元素的最后一位是否相等,不相等说明就两个字符串就不相等了,如果两个字符串的有一个大于等于0,说明已经有一个字符串结束了,另一个没有结束,所以两个字符不相等
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var backspaceCompare = function(s, t) {
let sl = s.length - 1, tl = t.length -1, sk = 0, tk = 0
while(sl >= 0 || tl >= 0) {
while(sl >= 0) {
if (s[sl] === '#') {
sk++, sl--
} else if (sk > 0) {
sk--, sl--
} else {
break
}
}
while(tl >= 0) {
if (t[tl] === '#') {
tk++, tl--
} else if (tk > 0) {
tk--, tl--
} else {
break
}
}
if (sl >= 0 && tl >= 0) {
console.log(s[sl], t[tl], tl)
if (s[sl] !== t[tl]) return false
} else {
if (sl >= 0 || tl >= 0) {
return false
}
}
sl--, tl--
}
return true
};