AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← OD 20 天课程

华为 OD 训练营 · 题解精讲

LC20. 有效的括号

LC20. 有效的括号 预习和复习可以查看我的讲解视频。

题目描述

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。

题目解析

有效的括号满足以下几个条件: 1、字符串的长度一定是偶数。 2、括号的匹配遵循右括号和最近的一个左括号进行匹配,它们匹配成功才有可能是有效的括号

参考代码

参考代码

# 登录 AlgoMooc 官网获取更多算法图解
# https://www.algomooc.com
# 作者:程序员吴师兄
# 代码有看不懂的地方一定要私聊咨询吴师兄呀
# // 有效的括号( LeetCode 20 ):https://leetcode-cn.com/problems/valid-parentheses
class Solution:
    def isValid(self, s: str) -> bool:
        # 当字符串长度为奇数的时候,属于无效情况,直接返回 False
        if len(s) % 2 == 1:
             # 无效情况,返回 False
             return False
        
       
        # 构建一个栈,用来存储括号
        stack = list()

        
        # 遍历字符串数组中的所有元素
        for c in s : 
            
            # 如果字符为左括号 ( ,那么就在栈中添加对左括号 (
            if c == '(' :
               
               # 添加对左括号 (
               stack.append('(')

             # 如果字符为左括号 [ ,那么就在栈中添加对左括号 [
            elif c == '[' :

               # 添加对应的右括号 ]
               stack.append('[')

             # 如果字符为左括号 { ,那么就在栈中添加对左括号 {
            elif c == '{' :

               # 添加对应的右括号 }
               stack.append('{')

               # 否则的话,说明此时 c 是 )] } 这三种符号中的一种
            else :
               
               # 如果栈已经为空,而现在遍历的字符 c 是 )] } 这三种符号中的一种
               # 找不到可以匹配的括号,返回 False
               # 比如这种情况  }{,直接从右括号开始,此时栈为空
               if not stack : 
                  return False
               
               # 如果栈不为空,获取栈顶元素
               top = stack[-1]

               # 将栈顶元素和此时的元素 c 进行比较,如果相同,则将栈顶元素移除
               if (top == '(' and c == ')' ) or (top == '[' and c == ']' ) or (top == '{' and c == '}')  :
                    # 移除栈顶元素
                    stack.pop()
               else :
                   # 如果不相同,说明不匹配,返回 False
                   return False

        
        # 遍历完整个字符数组,判断栈是否为空
        # 如果栈为空,说明字符数组中的所有括号都是闭合的
        # 如果栈不为空,说明有未闭合的括号
        return not stack
四、复杂度分析
时间复杂度:O(n),其中 n 是字符串 s 的长度。
空间复杂度:O(n+∣Σ∣),其中 Σ 表示字符集,本题中字符串只包含 6 种括号,|Σ| =6。栈中的字符数量为 O(n),而哈希表使用的空间为 O(∣Σ∣),相加即可得到总空间复杂度。