leetcode 844 比较含退格的字符串

该博客主要介绍了LeetCode 844题目的解题思路,包括两种方法:一是利用字符串的栈性质进行比较,二是从后往前遍历,考虑字母和#的影响,判断两个字符串在退格操作后是否相等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

给定 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);
            }
        }
    }
};
解法二

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

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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值