LeetCode 20. 有效的括号(Valid Parentheses)

20. 有效的括号

📘题目描述

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()[]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([])"

输出:true

💡解题思路:栈(Stack)

✅核心思想

  • 用栈保存遇到的待匹配右括号

  • 每次遇到左括号时,将它对应的右括号压入栈

  • 每次遇到右括号时:

    • 栈为空 → 不匹配

    • 弹出栈顶元素,若与当前右括号不一致 → 不匹配

  • 全部遍历完后,如果栈为空 → 字符串有效

✅代码实现 

class Solution:
    def isValid(self, s: str) -> bool:
        # 长度为奇数一定无效
        if len(s) % 2:
            return False

        stack = []
        for i in s:
            if i == '(':
                stack.append(')')
            elif i == '[':
                stack.append(']')
            elif i == '{':
                stack.append('}')
            elif not stack or stack.pop() != i:
                return False

        # 栈必须为空才是有效括号
        return not stack

✅可选写法:使用字典映射(更灵活) 

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        mapping = {')': '(', ']': '[', '}': '{'}
        for ch in s:
            if ch in mapping.values():
                stack.append(ch)
            else:
                if not stack or stack[-1] != mapping[ch]:
                    return False
                stack.pop()
        return not stack

⏱️复杂度分析 

项目复杂度说明
时间复杂度O(n)每个字符遍历一次
空间复杂度O(n)最坏情况栈大小为 n

🖼️图示理解

字符串:{ [ ( ) ] }

遍历过程:

stack: → '}'
stack: → '}', ']'
stack: → '}', ']', ')'
匹配到 ')', 弹出')'
匹配到 ']', 弹出']'
匹配到 '}', 弹出'}'
最终 stack 为空 → 合法

🧱易错点总结 

易错点正确做法说明
忽略了空字符串空字符串是合法的,应返回 True
忘记检查栈是否为空弹栈前必须判断栈是否为空
没处理不对称的嵌套结构栈顶元素必须与当前右括号匹配
长度为奇数时未提前返回 False奇数个括号不可能完全匹配

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值