LeetCode 678 有效的括号字符串[栈] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 678 有效的括号字符串[栈] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。


解题思路:
在一开始,我只是单纯的记录左右括号数量的差值和星的个数,但是这样的方法暴露出一个问题,即星出现在多出来的左括号左边,无法变成右括号抵消的情况,所以我决定用两个栈分别存储左括号和星的位置,帮助我判断是否能够变成右括号抵消。一开始遇到左括号和星都进栈,遇到右括号先左括号弹栈抵消,不够的话星弹栈抵消,都不够直接返回false,第一次遍历结束后,就可以比对左括号和星,如果左括号栈顶位置比星栈顶大,说明无法抵消,返回false,其余的都一个个抵消即可,最后返回左括号栈是否为空,为空说明抵消完了,为true,否则返回false,代码如下:

class Solution {
public:
    bool checkValidString(string s) {
        int n = s.size();
        stack<int> left;
        stack<int> stars;
        for(int i = 0; i < n; i ++) {
            if(s[i] == '(') {
                left.push(i);
            } else if(s[i] == '*') {
                stars.push(i);
            } else {
                // 首先用左括号抵消
                if(!left.empty()) left.pop();
                // 左括号不够用*抵消
                else if(!stars.empty()) stars.pop();
                else return false;
            }
        }
        while(!left.empty() && !stars.empty()) {
            if(left.top() > stars.top()) return false;
            left.pop();
            stars.pop();
        }
        return left.empty();
    }
};


/*作者:heroding
链接:https://leetcode-cn.com/problems/valid-parenthesis-string/solution/cshuang-zhan-cao-zuo-by-heroding-oye6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

以上是关于LeetCode 678 有效的括号字符串[栈] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题100天—678. 有效的括号字符串( 字符串)—day36

Leetcode刷题100天—678. 有效的括号字符串( 字符串)—day36

leetcode678

栈3:括号匹配问题的7道题

LeetCode 678. 有效的括号字符串(贪心,动规) / 4. 寻找两个正序数组的中位数(二分,关键题) / 447. 回旋镖的数量

leetcode-简单-栈-有效的括号