返回
探索有效括号嵌套的奥秘:LeetCode 20 - 有效的括号 Valid Parentheses
见解分享
2023-12-07 15:47:54
LeetCode 20:有效的括号 Valid Parentheses
前言
在编码实践和编程面试中,有效括号检查是一道经典问题,其考察重点在于字符串处理能力和逻辑思维能力。本篇文章将深入剖析LeetCode 20 - 有效的括号 Valid Parentheses 这道题,从理解题意、设计算法、优化实现到代码演示,逐步为你揭示问题的解决之道。
理解题意
LeetCode 20 - 有效的括号 Valid Parentheses 要求你判断一个由括号组成的字符串是否合法。所谓合法,是指括号必须成对出现,并且匹配顺序也必须正确。这六种括号及其对应的匹配对分别是:
- 小括号:'(' 和 ')'
- 中括号:'{' 和 '}'
- 方括号:'[' 和 ']'
算法设计
要解决这个问题,我们不妨使用栈(Stack)数据结构来辅助。栈是一种先进后出(First-In-Last-Out, FILO)的线性数据结构,它按照后进先出的原则对元素进行存储和访问。
具体算法步骤如下:
- 初始化一个栈,用于存储当前遇到的左括号。
- 遍历字符串中的每个字符。
- 如果当前字符是左括号,则将其压入栈中。
- 如果当前字符是右括号,则从栈顶弹出左括号进行匹配。
- 如果栈顶没有左括号可以匹配,则说明括号不匹配,返回 false。
- 如果遍历完整个字符串,栈中还有未匹配的左括号,则说明括号不匹配,返回 false。
优化实现
为了进一步优化算法的效率,我们可以使用哈希表(Hash Table)来存储括号及其对应的匹配对。这样,当遇到右括号时,我们可以通过哈希表快速找到它的匹配左括号,避免了遍历整个栈的开销。
代码演示
def is_valid_parentheses(s):
# 初始化栈和哈希表
stack = []
bracket_pairs = {')': '(', '}': '{', ']': '['}
# 遍历字符串
for char in s:
# 如果是左括号,则压入栈中
if char in bracket_pairs.values():
stack.append(char)
# 如果是右括号,则从栈顶弹出左括号进行匹配
elif char in bracket_pairs.keys():
if not stack or stack.pop() != bracket_pairs[char]:
return False
# 其他字符忽略
# 遍历完字符串后,如果栈中还有未匹配的左括号,则说明括号不匹配
return not stack
# 测试用例
test_cases = [
'()',
'[]{}',
'([{}])',
'{[()]',
')]'
]
# 运行测试用例
for test_case in test_cases:
print(f'Is "{test_case}" valid? {is_valid_parentheses(test_case)}')
结语
LeetCode 20 - 有效的括号 Valid Parentheses 是一道看似简单却极具挑战性的编程题,它不仅考验你的算法设计能力,还考验你的代码实现能力。通过本文的详细讲解,相信你已经对这道题有了深刻的理解和掌握。希望你在未来的编程学习和实践中,能够游刃有余地应对各种括号匹配问题。