返回

Leetcode刷题——有效的括号深度解析

前端

题目背景

在Leetcode上,有一个广为人知的题目——“有效的括号”。该题目的目的是判断一个只包含括号的字符串是否有效。其中,有效字符串需要满足两个条件:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。

解决思路

为了解决这个问题,我们可以使用栈的数据结构。栈是一种遵循后进先出(LIFO)原则的线性数据结构,这意味着最后一个进入栈中的元素将第一个被移出。

我们可以将左括号压入栈中,然后当遇到右括号时,我们将栈顶的元素弹出并检查它是否与当前右括号匹配。如果匹配,则继续处理下一个字符;如果不匹配,则字符串无效。

具体实现

以下是以Python语言实现的具体代码示例:

def is_valid(s):
  """
  判断一个只包含括号的字符串是否有效。

  Args:
    s (str): 输入字符串

  Returns:
    bool: 字符串是否有效
  """

  # 创建一个栈
  stack = []

  # 遍历字符串中的每个字符
  for char in s:
    # 如果是左括号,则将其压入栈中
    if char in "([{":
      stack.append(char)
    # 如果是右括号,则检查栈顶元素是否与之匹配
    elif char in ")]}":
      # 如果栈为空,则字符串无效
      if not stack:
        return False
      # 如果栈顶元素与当前右括号不匹配,则字符串无效
      if (char == ')' and stack[-1] != '(') or \
         (char == ']' and stack[-1] != '[') or \
         (char == '}' and stack[-1] != '{'):
        return False
      # 弹出栈顶元素
      stack.pop()

  # 如果栈为空,则字符串有效
  return not stack

代码示例

以下是一些代码示例:

# 示例1
s = "()[]{}"
print(is_valid(s))  # True

# 示例2
s = "([{}])"
print(is_valid(s))  # True

# 示例3
s = "((){[]})"
print(is_valid(s))  # True

# 示例4
s = "())"
print(is_valid(s))  # False

# 示例5
s = "([)]"
print(is_valid(s))  # False

时间复杂度和空间复杂度

该算法的时间复杂度为O(n),其中n是字符串的长度。这是因为算法需要遍历字符串中的每个字符。空间复杂度为O(n),这是因为算法需要使用栈来存储左括号。

总结

Leetcode上的“有效的括号”题目是一个经典的算法题,它考察了算法工程师对栈数据结构的理解和应用能力。通过本文的详细解析,希望你能对该题目的解决思路和具体实现有更深刻的理解。