leetcode 844. 比较含退格的字符串

2023.6.17

         这题使用的是暴力解法,大致思路是用erase方法将字符串s和t中的#以及#之前的字符去除掉,最后对比两个字符串是否相同。

        下面看下我略显冗余的代码:

class Solution {
public:
    bool backspaceCompare(string s, string t) 
    {
        //去除s中的#以及#之前的字符
        for(int i=0; i<s.size(); i++)
        {
            while(s[0] == '#') s.erase(s.begin());
            if(s[i] == '#')
            {
                s.erase(s.begin()+i);
                s.erase(s.begin()+i-1);
                i--;
                i--;
            }
        }
        //去除t中的#以及#之前的字符
        for(int i=0; i<t.size(); i++)
        {
            while(t[0] == '#') t.erase(t.begin());
            if(t[i] == '#')
            {
                t.erase(t.begin()+i-1);
                t.erase(t.begin()+i-1);
                i--;
                i--;
            }
        }
        //两字符串长度不相同,直接false
        if(s.size() != t.size()) return false;
        //两字符串都变空了,直接true
        if(s.size()==0 && t.size()==0) return true;
        //判断两字符串是否相同
        for(int i=0; i<s.size(); i++)
        {
            if(s[i] != t[i])
            {
                return false;
            }
        }
        return true;
    }
};

        双指针法:

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int i = s.size()-1;
        int j = t.size()-1;
        int skip_s = 0;
        int skip_t = 0;

        while(i>=0 || j>=0)
        {
            while(i>=0)
            {
                if(s[i] == '#')
                {
                    skip_s++;
                    i--;
                }
                else if(skip_s)
                {
                    skip_s--;
                    i--;
                }
                else break;
            }
            while(j>=0)
            {
                if(t[j] == '#')
                {
                    skip_t++;
                    j--;
                }
                else if(skip_t)
                {
                    skip_t--;
                    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;
    }
};

        能理解   但是估计临场应该写不出来。


2023.9.7

       时隔三个月,二刷。 想不明白当时怎么做的这么麻烦,直接重新定义两个string字符串s2和t2,然后将字符串s和t分别往里加入,遇到 ‘#’ 则删除刚加入的元素。 代码如下:

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        string s2;
        string t2;
        for(int i=0; i<s.size(); i++)
        {
            if(s[i] != '#') s2 += s[i]; 
            else
            {
                if(s2.size() != 0) s2.pop_back();
            }
        }
        for(int i=0; i<t.size(); i++)
        {
            if(t[i] != '#') t2 += t[i];
            else 
            {
                if(t2.size() != 0) t2.pop_back();
            }
        }
        if(s2 == t2) return true;
        return false;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值