给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([])”
输出:true
提示:
1 <= s.length <= 104 s 仅由括号 ‘()[]{}’ 组成
解法一
官方题解

def isValid(self, s: str) -> bool:
stack = list()
pairs = {')':'(','}':'{',']':'['}
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
解法 2:

def isValid(self, s: str) -> bool:
if len(s) % 2 == 1:
return False
stack = []
v = {
'(':')',
'[':']',
'{':'}'
}
for ele in s:
if ele in '([{':
stack.append(ele)
elif ele in ')]}':
if not stack or v[stack[-1]] != ele:
return False
stack.pop()
return not stack
解法 3:这是一个减少内存占用,增快速度的写法

题解:
def isValid(self, s: str) -> bool:
stack = []
bracket_map = {')':'(','}':'{',']':'['}
for char in s:
if char in bracket_map.values():
stack.append(char)
elif char in bracket_map.keys():
if stack and stack[-1] == bracket_map[char]:
stack.pop()
else:
return False
else:
return False
return not stack
- 初始化栈和括号映射:
• stack 用来存放左括号。
• bracket_map 是一个字典,记录了每个右括号对应的左括号。比如,‘)’ 对应 ‘(’,‘}’ 对应 ‘{’,‘]’ 对应 ‘[’。 - 遍历字符串中的每个字符:
• 遍历输入字符串 s 中的每个字符 char。 - 处理左括号:
• 如果当前字符是一个左括号(即 ‘(’, ‘{’, ‘[’),将其加入栈 stack 中。 - 处理右括号:
• 如果当前字符是右括号(即 ‘)’, ‘}’, ‘]’),需要检查栈顶的元素是否与当前右括号匹配。
• 如果栈不为空且栈顶的元素是当前右括号对应的左括号(例如,当前是 ‘)’,栈顶是 ‘(’),则将栈顶元素弹出,表示配对成功。
• 否则,返回 False,表示括号不匹配。
5. 处理非括号字符:
• 如果当前字符不是括号,直接返回 False,说明输入的字符串中包含无效字符。
6. 检查栈是否为空:
• 最后,如果栈为空,表示所有的左括号都有对应的右括号,返回 True。
• 如果栈不为空,表示有未配对的左括号,返回 False。
一个巧妙的做法,来自
https://qiaoxs.blog.youkuaiyun.com/article/details/124480273
不断消去字符串中的’()‘、’[]‘、’{}'子串,直至不存在这些子串。此时,如果字符串为空,代表有效。
该算法效率不高,但非常巧妙,且代码非常优美。
class Solution(object):
def isValid(self, s):
while True:
pre_len = len(s)
s = s.replace('()', '')
s = s.replace('[]', '')
s = s.replace('{}', '')
if len(s) == pre_len:
return pre_len == 0