每日一题(LeetCode)----数组--移除元素(四)

每日一题(LeetCode)----数组–移除元素(四)

1.题目([844. 比较含退格的字符串](https://leetcode.cn/problems/sqrtx/))

给定 st 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 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
  • st 只含有小写字母以及字符 '#'

进阶:

  • 你可以用 O(n) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?

2.解题思路

思路一: 重构字符串(单指针)

1.先将两个字符串中的退格字符和应该被删除的字符去除掉

我们用一个变量来存已经遍历到的退格字符的数量

然后我们从后向前遍历这两个字符串

如果遍历到的是退格字符,那么删除退格字符,然后记录已经遍历到退格字符的数量的变量进行加一操作

如果遍历到的是字符,那我们看记录已经遍历到退格字符的数量的变量是否大于0

如果大于0删除当前遍历到的字符,记录已经遍历到退格字符的数量的变量进行减一操作

如果小于0,那么不进行操作,进行向前遍历

2.然后将两个字符串进行比较

思路二: 重构字符串(栈)

最容易想到的方法是将给定的字符串中的退格符和应当被删除的字符都去除,还原给定字符串的一般形式。然后直接比较两字符串是否相等即可。

具体地,我们用栈处理遍历过程,每次我们遍历到一个字符:

如果它是退格符,那么我们将栈顶弹出;

如果它是普通字符,那么我们将其压入栈中。

原作者:力扣官方题解
链接:https://leetcode.cn/problems/backspace-string-compare/

3.写出代码

思路一的代码:

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int length1 = s.size();
        int length2 = t.size();
        int sum1 = 0;
        int sum2 = 0;
        for (int i = length1 - 1; i >= 0; i--) {
            if (s.size() == 0) {
                break;
            }
            if (s[i] == '#') {
                s.erase(i, 1);
                sum1++;
            }
            else {
                if (sum1 > 0) {
                    s.erase(i, 1);
                    sum1--;
                }
            }
        }

        for (int i = length2 - 1; i >= 0; i--) {
            if (t.size() == 0) {
                break;
            }

            if (t[i] == '#') {
                t.erase(i, 1);
                sum2++;
            }
            else {
                if (sum2 > 0) {
                    t.erase(i, 1);
                    sum2--;
                }
            }
        }

        //进行比较
        if (s == t) {
            return true;
        }
        else {
            return false;
        }
    }
};

思路二的代码:

class Solution {
public:
    bool backspaceCompare(string S, string T) {
        return build(S) == build(T);
    }

    string build(string str) {
        string ret;
        for (char ch : str) {
            if (ch != '#') {
                ret.push_back(ch);
            } else if (!ret.empty()) {
                ret.pop_back();
            }
        }
        return ret;
    }
};
原作者:力扣官方题解
链接:https://leetcode.cn/problems/backspace-string-compare/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小白的code之路(记录分享)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值