[路飞]_比较含退格的字符串

146 阅读1分钟

题目介绍

给定 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() };

解题思路二

用双指针

  1. 一个字符是否要给删掉取决于该字符串后面#字符串,与前面的#没有关系,所以我们可以从后面开始遍历起
  2. 分别记录s和t字符的#号符,遇到就加1,否则就减一,同时对应字符串的下标也减一
  3. 一次循环后先判断两个字符串的下标都大于等于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
};