返回

探索有效括号嵌套的奥秘:LeetCode 20 - 有效的括号 Valid Parentheses

见解分享

LeetCode 20:有效的括号 Valid Parentheses

前言

在编码实践和编程面试中,有效括号检查是一道经典问题,其考察重点在于字符串处理能力和逻辑思维能力。本篇文章将深入剖析LeetCode 20 - 有效的括号 Valid Parentheses 这道题,从理解题意、设计算法、优化实现到代码演示,逐步为你揭示问题的解决之道。

理解题意

LeetCode 20 - 有效的括号 Valid Parentheses 要求你判断一个由括号组成的字符串是否合法。所谓合法,是指括号必须成对出现,并且匹配顺序也必须正确。这六种括号及其对应的匹配对分别是:

  • 小括号:'(' 和 ')'
  • 中括号:'{' 和 '}'
  • 方括号:'[' 和 ']'

算法设计

要解决这个问题,我们不妨使用栈(Stack)数据结构来辅助。栈是一种先进后出(First-In-Last-Out, FILO)的线性数据结构,它按照后进先出的原则对元素进行存储和访问。

具体算法步骤如下:

  1. 初始化一个栈,用于存储当前遇到的左括号。
  2. 遍历字符串中的每个字符。
  3. 如果当前字符是左括号,则将其压入栈中。
  4. 如果当前字符是右括号,则从栈顶弹出左括号进行匹配。
  5. 如果栈顶没有左括号可以匹配,则说明括号不匹配,返回 false。
  6. 如果遍历完整个字符串,栈中还有未匹配的左括号,则说明括号不匹配,返回 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 是一道看似简单却极具挑战性的编程题,它不仅考验你的算法设计能力,还考验你的代码实现能力。通过本文的详细讲解,相信你已经对这道题有了深刻的理解和掌握。希望你在未来的编程学习和实践中,能够游刃有余地应对各种括号匹配问题。