基本思路为:利用栈和映射字典,遇到左括号入栈,遇到右括号时检查栈顶元素是否匹配,若不匹配则返回
False
,最后检查栈是否为空来确定字符串是否有效。
首先,创建一个空栈存储左括号;
创建一个映射字典,键为左括号,值为对应的右括号;
遍历字符,如果当前字符是左括号就压入栈中;如果是右括号,如果栈是空的则返回False;弹出栈顶元素,如果此元素对应的和char不一样,返回False;
遍历结束后若栈为空,说明所有的左括号都匹配右括号,返回True。
此代码运行效率中等,在LeetCode中属于中等水平:
class Solution(object):def isValid(self, s):""":type s: str:rtype: bool"""# 初始化一个空栈,用于存储左括号stack = []# 创建一个映射字典,键为左括号,值为对应的右括号mapping = {"(": ")", "[": "]", "{": "}"}# 遍历输入字符串中的每个字符for char in s:# 如果当前字符是左括号if char in mapping:# 直接将左括号压入栈中stack.append(char)else:# 如果当前字符是右括号if not stack:# 若栈为空,说明没有对应的左括号,返回 Falsereturn False# 弹出栈顶元素top_element = stack.pop()# 检查栈顶元素对应的右括号是否和当前字符相等if mapping[top_element] != char:return False# 遍历结束后,若栈为空,说明所有左括号都有匹配的右括号,返回 True;否则返回 Falsereturn len(stack) == 0
大佬做法:
class Solution:def isValid(self, s: str) -> bool:# 如果字符串长度为奇数,那么必然存在一个括号无法匹配,直接返回 Falseif len(s) % 2 == 1:return False# 定义一个字典,键为右括号,值为对应的左括号,用于后续匹配检查pairs = {")": "(","]": "[","}": "{",}# 初始化一个空列表作为栈,用于存储遍历过程中遇到的左括号stack = list()# 遍历输入字符串中的每个字符for ch in s:# 如果当前字符是右括号if ch in pairs:# 如果栈为空,说明没有对应的左括号;或者栈顶元素与当前右括号对应的左括号不匹配# 则说明括号序列无效,返回 Falseif not stack or stack[-1] != pairs[ch]:return False# 若匹配成功,弹出栈顶元素stack.pop()else:# 如果当前字符是左括号,将其压入栈中stack.append(ch)# 遍历结束后,如果栈为空,说明所有左括号都找到了对应的右括号,返回 True# 否则返回 Falsereturn not stack