小阳同学刷题日记-844. 比较含退格的字符串

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

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

        这道题我所知道的有两种解法:①快慢指针法;②栈

         ①快慢指针法:

class Solution {
public:
    // 判断经过退格操作后的两个字符串是否相等
    bool backspaceCompare(string s, string t) {
        // 对字符串 s 和 t 进行退格操作,得到实际字符串
        string s1 = truth(s);
        string t1 = truth(t);

        // 比较两个实际字符串是否相等
        return s1 == t1;
    }

private:
    // 对输入的字符串进行退格操作,返回经过退格操作后的实际字符串
    string truth(string x){
        int flow = 0; // 指示当前字符应该插入的位置
        int n = x.size(); // 获取字符串的长度

        // 遍历字符串
        for(int fast = 0; fast < n; fast++) {
            if(x[fast] != '#') { // 如果当前字符不是退格字符
                x[flow] = x[fast]; // 将当前字符复制到实际字符串的指定位置
                flow++; // 更新实际字符串的指针位置
            } else { // 如果当前字符是退格字符
                flow = max(flow - 1, 0); // 将指针前移一位,但不小于 0
            }
        }

        // 返回经过退格操作后的实际字符串
        return x.substr(0, flow); // 返回指定长度的子串,即经过退格操作后的实际字符串
    }
};

        substr() 是 C++ 中的一个字符串成员函数,用于从字符串中提取子串。它有两种形式的重载:

  1. substr(pos, len)从字符串中提取从位置 pos 开始,长度为 len 的子串。
  2. substr(pos)从字符串中提取从位置 pos 开始到末尾的子串。

        ②栈: 

        解题思路:

  1. 遍历字符串 s,遇到非退格字符就入栈,遇到退格字符就弹出栈顶元素(如果栈不为空)。
  2. 遍历字符串 t,同样地,遇到非退格字符就入栈,遇到退格字符就弹出栈顶元素(如果栈不为空)。
  3. 比较两个栈是否相等,如果相等则返回 true,否则返回 false。
class Solution {
public:
    bool backspaceCompare(string s, string t) {
        // 使用栈来模拟字符串编辑器的输入过程
        stack<char> stack_s, stack_t;
        
        // 对字符串 s 进行处理
        for (char c : s) {
            if (c != '#') {
                stack_s.push(c); // 非退格字符入栈
            } else if (!stack_s.empty()) {
                stack_s.pop(); // 退格字符弹出栈顶元素
            }
        }
        
        // 对字符串 t 进行处理
        for (char c : t) {
            if (c != '#') {
                stack_t.push(c); // 非退格字符入栈
            } else if (!stack_t.empty()) {
                stack_t.pop(); // 退格字符弹出栈顶元素
            }
        }
        
        // 比较两个栈是否相等
        return stack_s == stack_t;
    }
};

        谢谢大家,继续努力。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值