在问 · 算法题解

20. 有效的括号

题目描述

输入字符串 s,它只由 '('、')'、'['、']'、'{'、'}' 六种字符组成。

满足下面三条时,s 是有效的:每个左括号都由同类型的右括号关闭;后打开的左括号要先关闭;每个右括号前面都有一个同类型的左括号与之配对。

有效时返回 true,否则返回 false。

示例 1
输入:s = "()"
输出:true
示例 2
输入:s = "()[]{}"
输出:true

解释:三对括号依次各自配对。

示例 3
输入:s = "(]"
输出:false

解释:'(' 遇到的是 ']',类型不同。

示例 4
输入:s = "([])"
输出:true

解释:[] 嵌在 () 里,配对顺序正确。

示例 5
输入:s = "([)]"
输出:false

解释:'[' 还没关闭时就出现了 ')',顺序交错。

数据范围

  • 1 <= s.length <= 10^4
  • s 只含括号字符 '()[]{}'。

解题思路

左括号入栈,右括号匹配栈顶。

为什么正确

栈保存尚未闭合的左括号。

复杂度分析

时间 O(n),额外空间 O(n)。

易错点

注意边界条件并在回溯或弹出后恢复状态。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
 def isValid(self,s):
  p={')':'(',']':'[','}':'{'};st=[]
  for c in s:
   if c in '([{':st.append(c)
   elif not st or st.pop()!=p[c]:return False
  return not st

载入编辑器,自己跑一遍 →

栈与堆 专题的其他题目

查看 栈与堆 全部题目 →