【LeetCode20】有效的括号(栈)

简介: 对给定的字符串进行遍历,当遇到一个左括号时,后面需要有一个相同类型的括号与其匹配,并且后遇到的左括号要先匹配,所以可以使用一个栈(先进后出,后进先出)。

1.题目

image.pngimage.png


2.思路

对给定的字符串进行遍历,当遇到一个左括号时,后面需要有一个相同类型的括号与其匹配,并且后遇到的左括号要先匹配,所以可以使用一个栈(先进后出,后进先出)。


遍历字符串:

(1)如果当前字符为左半边括号时,则压入栈中;

(2)如果为右半边括号时:

——若此时栈空则返回false;

——若当前遍历到的元素和栈顶元素恰好匹配成功则完成一个匹配的小目标(只有全部遍历完栈为空才能够返回true),所以这里有三个判断是返回false的,最后记得弹栈(才能继续下一个匹配小目标)。


注意:

有效字符串的长度一定为偶数——如果字符串的长度为奇数,可以直接返回false,省去后续的遍历判断过程。


3.代码


 class Solution {
public:
    bool isValid(string s) {
        if(s.size()%2==1){//若为符号数为奇数则为false
            return false;
        }
        stack<char>zhan;
        for(int c=0;c<s.size();c++){//遍历一遍字符串的每个符号
            if(s[c]=='('||s[c]=='['||s[c]=='{')
                zhan.push(s[c]);
            else{
                if(zhan.empty())
                    return false;
                if(s[c]==')'&&zhan.top()!='(')
                    return false;
                if(s[c]==']'&&zhan.top()!='[')
                    return false;
                if(s[c]=='}'&&zhan.top()!='{')
                    return false;
                zhan.pop();
            }
        }
        return zhan.empty();//判断最后栈是否为空
    }
};

4.注意

(1)for (char c : s)会复制一个s字符串再进行遍历操作,而使用for(char& c:s)时直接引用原来字符串进行遍历操作——由于复制一个字符串花费了时间,所以用前者的时间开销更多。

(2)以下是官方题解

class Solution {
public:
    bool isValid(string s) {
        int n = s.size();
        if (n % 2 == 1) {
            return false;
        }
        unordered_map<char, char> pairs = {
            {')', '('},
            {']', '['},
            {'}', '{'}
        };
        stack<char> stk;
        for (char ch: s) {
            if (pairs.count(ch)) {
                if (stk.empty() || stk.top() != pairs[ch]) {
                    return false;
                }
                stk.pop();
            }
            else {
                stk.push(ch);
            }
        }
        return stk.empty();
    }
};
相关文章
|
13天前
|
算法 C++
Leetcode第二十二题(括号生成)
这篇文章讨论了如何使用递归算法解决LeetCode第22题“括号生成”的问题,提供了两种C++的实现方法,目的是生成所有有效的括号组合。
9 0
Leetcode第二十二题(括号生成)
|
3月前
|
存储 算法 测试技术
力扣经典150题第五十四题:最小栈
力扣经典150题第五十四题:最小栈
32 0
|
4月前
|
存储 算法 索引
力扣每日一题 6/24 模拟 数组 单调栈
力扣每日一题 6/24 模拟 数组 单调栈
31 0
|
12天前
【LeetCode 24】225.用队列实现栈
【LeetCode 24】225.用队列实现栈
8 0
|
13天前
|
存储 C++ 容器
Leetcode第二十题(有效的括号)
这篇文章介绍了如何使用栈来解决LeetCode第20题“有效的括号”问题,提供了两种方法:数组栈和容器栈,以及相应的C++代码实现。
12 0
|
13天前
|
算法
【LeetCode 23】232.用栈实现队列
【LeetCode 23】232.用栈实现队列
14 0
|
2月前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
2月前
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
22 4
|
2月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
24 6