• 【面试经典150 | 栈】有效的括号


    Tag

    【栈】


    题目来源

    20. 有效的括号


    题目解读

    括号有三种类型,分别是小括号、中括号和大括号,每种括号的左右两半括号必须一一对应才是有效的括号,如果某一种括号之间穿插者其他的闭合的括号,那么这个括号字符串也是有效的,比如 "({[]})" 就是一个有效的括号字符串。

    现在给你一个仅有括号组成的字符串,判断该字符串是否是有效的字符串。


    解题思路

    方法一:栈+哈希表

    本题使用栈来解决,我们可以边更新栈边在栈中找闭合的括号。

    我们遍历字符串,如果栈为空,我们自然是要将当前的括号字符加入到栈中的,继续遍历字符串:

    • 当遇到的括号是右括号时,我们希望可以找到一个相同类型的左括号,于是如果栈顶的括号是对应类型的左括号,那么我们就将栈顶匹配的左括号弹出站;如果栈顶的括号不是对应类型的左括号,则当前遍历的括号无法闭合,那么该符号字符串不是有效的字符串,直接返回 false
    • 当遇到的括号是左括号字符串时,直接将当前字符入栈;
    • 遍历完字符串,如果最后栈为空,则该字符串是有效的字符串,直接返回 true;否则返回 false

    在判断当前遍历的字符是否是右括号时,可以使用哈希表。具体地,定义一个键为右括号字符,值为对应的左括号字符的哈希表 pairs。在遍历字符串时,如果当前字符在哈希表的键中,可以使用 pairs.count() 或者 pairs.find() 来查找当前字符是否是右括号;如果当前字符是右括号,那么还可以使用哈希表来查找栈顶元素是否是左括号。

    特别的,如果字符串的长度为奇数,那么该字符串一定不是有效的括号字符串。

    实现代码

    class Solution {
    public:
        bool isValid(string s) {
            int n = s.size();
    		if (n % 2 == 1)
    			return false;
    
    		unordered_map<char, char> pairs = {
    			{')', '('},
    			{']', '['},
    			{'}', '{'}
    		};
    
    		stack<char> st;
    		for (auto ch : s) {
    			if (pairs.count(ch)) {
    				if (st.empty() || st.top() != pairs[ch])
    					return false;
    				st.pop();
    			}
    			else st.push(ch);
    		}
    		return st.empty();
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    复杂度分析

    时间复杂度: O ( n ) O(n) O(n) n n n 为字符串 s 的长度。

    空间复杂度: O ( n ) O(n) O(n)


    其他语言

    c

    char pairs(char a) {
        if (a == '}') return '{';
        if (a == ']') return '[';
        if (a == ')') return '(';
        return 0;
    }
    
    bool isValid(char* s) {
        int n = strlen(s);
        if (n % 2 == 1) {
            return false;
        }
        int stk[n + 1], top = 0;
        for (int i = 0; i < n; i++) {
            char ch = pairs(s[i]);
            if (ch) {
                if (top == 0 || stk[top - 1] != ch) {
                    return false;
                }
                top--;
            } else {
                stk[top++] = s[i];
            }
        }
        return top == 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    python3

    class Solution:
        def isValid(self, s: str) -> bool:
            if len(s) % 2 == 1:
                return False
            
            pairs = {
                ")": "(",
                "]": "[",
                "}": "{",
            }
            stack = list()
            for ch in s:
                if ch in pairs:
                    if not stack or stack[-1] != pairs[ch]:
                        return False
                    stack.pop()
                else:
                    stack.append(ch)
            
            return not stack
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    写在最后

    如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

    如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

    最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。

  • 相关阅读:
    【无标题】
    最新AI创作系统ChatGPT源码+搭建部署教程+支持GPT4.0+支持ai绘画(Midjourney)/支持Prompt
    CiscoCUCM安装初始化
    C++第二十三弹---深入理解STL中list的使用
    mkcert 学习笔记
    Playwright Python 持久化浏览器上下文
    【Axure视频教程】可拖动的知识图谱
    【c++】stack和queue模拟实现
    Js使用ffmpeg进行视频剪辑和画面截取
    Web3中文|NFT无法保障数字所有权?
  • 原文地址:https://blog.csdn.net/weixin_54383080/article/details/133949787