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