比较含退格的字符串

135 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

题目描述

给定 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"。

提示:

  • 1 <= s.length, t.length <= 200
  • s 和 t 只含有小写字母以及字符 '#'

思路

本题可以使用栈解法和使用双指针解法。

栈解法:

遍历字符串的每一个字符,如果遇到了退格符并且栈不为空就把栈顶元素出栈,如果不是退格符就把当前字符加入栈中(这里不用再额外开辟一个stack,直接使用字符串本身),最后返回这个新的字符串即退格后的字符串,然后两个字符串进行比较,得出答案。

双指针解法:

准备两个指针 i, j 分别指向 S,T 的末位字符,再准备两个变量 是s1,s2来分别存放 S,T 字符串中的 # 数量。 从后往前遍历 字符串,所遇情况有三,如下所示:

  • 若当前字符是 #,则 s1自增 1;
  • 若当前字符不是 #,且 s1不为 0,则 s1自减 1;
  • 若当前字符不是 #,且 s1为 0,则代表当前字符不会被消除,我们可以用来和 T 中的当前字符作比较。

若对比过程出现 S, T 当前字符不匹配,则遍历结束,返回 false,若S,T 都遍历结束,且都能一一匹配,则返回 true。

代码

用栈解法

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int length1 = s.size(), length2 = t.size();
        return build(s) == build(t);
    }
​
    string build(string s)
    {
        string res;
        for(char ch : s)
        {
            if(ch != '#')
            {
                res.push_back(ch);
            }else if(!res.empty()){
                res.pop_back();
            }
        }
        return res;
    }
};

双指针解法

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int i = s.size() - 1, j  = t.size() - 1;
        int s1 = 0, s2 = 0;
        while(i >= 0 || j >= 0 )
        {
            while(i >= 0)
            {
                if(s[i] == '#')
                {
                    i--, s1 ++;
                }
                else if(s1 > 0)
                {
                    s1 --;
                    i --;
                }
                else break;
​
            }
​
             while(j >= 0)
            {
                if(t[j] == '#')
                {
                    j--, s2 ++;
                }
                else if(s2 > 0)
                {
                    s2 --;
                    j --;
                }
                else break;
​
            }
​
            if(i >= 0 && j >= 0)
            {
                if(s[i] != t[j]) return false;
            }else
            {
                if(i >= 0 || j >= 0) return false;
            }
                
                i --;
                j --;
​
        }
        return true;
    }
   
};