个人算法成长之路二十六!!!定期更新一些刷题过程中个人的思路以及理解。有兴趣的朋友们可以互动交流哈~
题目:
leetcode-844. 比较含退格的字符串
给定 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”。
解题思路:
- 遇字母,放入
栈,遇到#,弹出栈。两栈转字符串,比较是否相等
var backspaceCompare = function(S, T) {
var c = (s, a = []) => {
for(var i = 0; i < s.length; i++)
s[i] === '#' ? a.pop() : a.push(s[i])
return a.join('')
}
return c(S) === c(T)
};
双指针
- 指针p0和p1分别从S和T末尾左移。指到#,#次数加1左移。指到字母,#次数减1左移
- 直到指字母,#次数为0,比较字母,不同则返回false。相同左移
- 当p0或p1其一移出字符串头部,值-1,另一方可能仍在字符串内。如 abc 与 ##abc,应继续循环
var backspaceCompare = function(S, T) {
var p = [S.length - 1, T.length - 1, 0, 0]
while(p[0] > -1 || p[1] > -1) {
while(p[2] || S[p[0]] === '#') S[p[0]] === '#' ? p[2]++ : p[2] && p[2]--, p[0]--
while(p[3] || T[p[1]] === '#') T[p[1]] === '#' ? p[3]++ : p[3] && p[3]--, p[1]--
if (S[p[0]] !== T[p[1]]) return false
p[0]--, p[1]--
}
return true
};