返回

LeetCode 刷题:有效括号

前端

LeetCode 刷题:20. 有效的括号

在解决编程问题时,熟悉数据结构和算法至关重要,而 LeetCode 提供了一个绝佳的平台,让我们可以通过解决各种问题来磨练我们的技能。今天,我们将深入探讨 LeetCode 上的 20 号问题:有效的括号。

问题

给定一个只包含以下字符的字符串 s

  • (,左圆括号
  • ),右圆括号
  • {, 左花括号
  • }, 右花括号
  • [, 左方括号
  • ], 右方括号

判断字符串 s 是否有效。

有效括号的定义如下:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须按正确的顺序闭合。

例如:

"()" 是有效的,因为每一个左括号都有一个匹配的右括号,并且它们按正确的顺序闭合。
"{[]}" 是有效的,因为每一个左括号都有一个匹配的右括号,并且它们按正确的顺序闭合。
"([)]" 是无效的,因为右括号不能与它之前的左方括号相匹配。
"{[}" 是无效的,因为右方括号不能与它之前的左花括号相匹配。

解题思路

要解决这个问题,我们可以使用栈数据结构。栈是一种后进先出 (LIFO) 数据结构,这意味着最后一个进栈的元素也是第一个出栈的元素。

我们可以将左括号推入栈中,然后每遇到一个右括号,我们就将栈顶的元素弹出。如果弹出元素与当前右括号匹配,则说明括号有效;否则,说明括号无效。

例如,对于字符串 "()", 我们会将左括号 '(' 推入栈中,然后遇到右括号 ')' 时,我们将其弹出。弹出元素与当前右括号匹配,因此括号有效。

代码实现

def isValid(s):
    """
    :type s: str
    :rtype: bool
    """
    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
        else:
            return False

    return not stack

复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串 s 的长度。我们遍历字符串一次,每个字符的时间复杂度为 O(1)。
  • 空间复杂度:O(n),因为我们使用栈来存储左括号,在最坏的情况下,当所有括号都是有效的时,栈的大小将达到 n。

结语

通过解决 LeetCode 上的 20 号问题,我们加强了对栈数据结构的理解,并提高了对括号匹配规则的认识。记住,在解决编程问题时,熟悉数据结构和算法是至关重要的。继续练习,不断提升你的编程技能!