leetcode刷题之数组NO.5

1.题目

2.解法一:重构字符串法

2.1.思路分析

  • 普通的字符串比较就是一个字符一个字符相比较,但是这个题目中的字符串特殊之处在于,最终真正要比较的字符串和给出的字符串是不一样的,因此我们想到将那些不用比较的字符删除,得到最终的字符串再比较

2.2.算法描述

算法很简单,分为下面的两步:

  • 首先建立两个栈来存储;
  • 如果字符不是#,则入栈;
  • 如果字符是#栈非空时,则出栈;
  • 等字符重构完毕,再进行比较。

2.3.代码实现

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        bool result = true;
        result = changeStr(s) == changeStr(t);

        return result;
    }

    string changeStr(string s) {
        string ret;

        for (auto c : s) {
            if (c != '#') {
                ret.push_back(c);
            } else if (!s.empty()) {
                ret.pop_back();
            }
        }

        return ret;
    }

};

3.解法二:双指针法

4.总结

  • 在使用重构字符串法解题时,实现用栈重构的时候,犯的错误就是没有思考出栈的时候要同时满足两个条件,一个是非空,一个是出现了特殊字符,而是把特殊字符的处理单独拎出来,这就使得逻辑不完善,有的测试用例得不到正确结果。
void changeStr(string & s, stack<int> & s_s) {
        if (s[0] == '#') {
            return;
        }
        for (int i = 0; i < s.size(); i++) {
           if (s[i] != '#') {
               s_s.push(s[i]);
           } else {
               s_s.pop();
           }
        }
    }
  • 如果使用C++来写的话,可以使用C++11的range for语句来代替for语句,这样的好处一是使用方便,二是防止溢出。
    • 范围for:for (循环变量:对象){ 执行语句 }每一次迭代都会将对象的下一个元素拷贝给变量。
posted @ 2021-12-04 22:45  曼路的个人博客  阅读(31)  评论(0编辑  收藏  举报