844. 比较含退格的字符串

844. 比较含退格的字符串

题目描述:给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。

输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。

解答:

法一:模拟出入栈。遇到#出栈,其他字符入栈。最后再出依次进行比较,如果相同返回true。需要注意的是对于空文本出栈要进行额外处理,即为在出栈前先进行empty()的判断,非空则进行出栈。

代码实现:

#include<stack>
class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int nums = s.size(),numt = t.size();
        stack<char>stackS,stackT;
        for (int i = 0; i<nums; i++){
            if (s[i] !='#')
                stackS.push(s[i]);
            else if (!stackS.empty())//非空则出栈
                stackS.pop();
        }
        for (int i = 0; i<numt; i++){
            if (t[i] !='#')
                stackT.push(t[i]);
            else if(!stackT.empty())
                stackT.pop();
        }
        bool result = stackCompare(stackS,stackT);//判断字符串是否相同
        return result;
    }
private:
    bool stackCompare(stack<char>stackS, stack<char>stackT){
        int numS = stackS.size(),numT = stackT.size();
        if (numS != numT)
            return false;
        else{
            for (int i = 0; i<numS; i++){
                if (stackS.top() != stackT.top())
                    return false;
                stackS.pop();
                stackT.pop();
            }
            return true;
        }
    }
};

法二:使用移除元素中相同的办法——双指针。使用两个指针,一个指向s,一个指向t。从后往前(因为#会消除前一个字母 )进行消除#。

同时从后向前遍历S和T(i初始为S末尾,j初始为T末尾),记录#的数量,模拟消除的操作,如果#用完了,就开始比较S[i]和S[j]。

如果S[i]和S[j]不相同返回false,如果有一个指针(i或者j)先走到的字符串头部位置,也返回false。

代码实现:(参考代码随想录)

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        int sSkipNum = 0; // 记录S的#数量
        int tSkipNum = 0; // 记录T的#数量
        int i = S.size() - 1;
        int j = T.size() - 1;
        while (1) {
            while (i >= 0) { // 从后向前,消除S的#
                if (S[i] == '#') sSkipNum++;
                else {
                    if (sSkipNum > 0) sSkipNum--;
                    else break;
                }
                i--;
            }
            while (j >= 0) { // 从后向前,消除T的#
                if (T[j] == '#') tSkipNum++;
                else {
                    if (tSkipNum > 0) tSkipNum--;
                    else break;
                }
                j--;
            }
            // 后半部分#消除完了,接下来比较S[i] != T[j]
            if (i < 0 || j < 0) break; // S 或者T 遍历到头了
            if (S[i] != T[j]) return false;
            i--;j--;
        }
        // 说明S和T同时遍历完毕
        if (i == -1 && j == -1) return true;
        return false;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值