leetcode 844 比较含退格的字符串

描述

给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。

示例 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”。

提示:

1 <= S.length <= 200
1 <= T.length <= 200
S 和 T 只含有小写字母以及字符 ‘#’。

思路

解法一

借用两个栈,这里直接用字符串来的,c++里面字符串有栈的作用。从前往后扫描输入字符串,不为空遇到#,出栈一个字符,遇到字母,入栈。最后比较构造的两个字符串是否相等。

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        string s1,t1;
        s1=f(S);
        t1=f(T);
        return s1==t1;
    }
    
    string f(string t){
        string s1;
        for(auto a:t){
            if(a=='#'){
                if(!s1.empty())s1.pop_back();
            }
            else{
                s1.push_back(a);
            }
        }
        return s1;

    }
};

这是用不用字符串用char栈的解法。

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        stack<char> s1;
        stack<char> s2;
        f(s1,S);f(s2,T);
        if(s1.size()!=s2.size())return false;
        while(!s1.empty()){
            if(s1.top()!=s2.top())return false;
            s1.pop(),s2.pop();
        }
        return true;
    }
    
    void f(stack<char> &st,string s){
        for(auto a:s){
            if(a=='#'){
                if(!st.empty()){
                    st.pop();
                }
            }
            else{
                st.push(a);
            }
        }
    }
};
解法二

我们从后往前看,如果遇到的是字母,这个字母肯定是不会被退格给删除的,如果遇到的是#,我们就需要跳过下一个字母字符。

扫描二维码关注公众号,回复: 6087177 查看本文章
class Solution {
public:
    bool backspaceCompare(string S, string T) {
        int s=S.size()-1;
        int t=T.size()-1;
        int c1=0,c2=0;
        while(s>=0||t>=0){
            while(s>=0){
                if(S[s]=='#')c1++,s--;
                else if(c1>0)c1--,s--;
                else break;
            }
            while(t>=0){
                if(T[t]=='#')c2++,t--;
                else if(c2>0)c2--,t--;
                else break;
            }
           
            if(s>=0&&t>=0&&S[s]!=T[t])return false;//
            if((s>=0)!=(t>=0))return false;//字母和空比较
            s--,t--;
        }
        return true;
    }
};

猜你喜欢

转载自blog.csdn.net/yrk0556/article/details/89525251
今日推荐