[路飞]_算法成长之路二十六,比较含退格的字符串

142 阅读1分钟

个人算法成长之路二十六!!!定期更新一些刷题过程中个人的思路以及理解。有兴趣的朋友们可以互动交流哈~

题目:

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
};