返回

路飞2.0 教您轻松刷题:[20. 有效的括号]

前端

正文

写在前面:
对于任何一个括号题,从题目的要求中,往往就可以直接把思路确定为用栈的方式进行解答。如果是实现题,甚至不需要考察具体实现的内容,只需要明确栈的数据结构,就可以将题目解答出来。当然,这是在已经掌握栈这种数据结构的应用基础上的。


简单来说,栈是一种具有后进先出(Last-In-First-Out,LIFO)性质的线性表。栈最经典的应用就是浏览器历史记录,每当我们访问一个新网页时,新网页被压入栈顶,当我们想访问历史记录中的某一网页时,我们只需弹出栈顶即可。

本题要求:
给定一个字符串 s,只包含 '(',')','{','}','[',']'。判断字符串是否有效。

有效括号的基本规则

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

实现思路:

  1. 定义一个栈。
  2. 遍历字符串,遇到左括号时,将左括号入栈;遇到右括号时,弹出栈顶元素并检查是否与当前右括号匹配。
  3. 如果所有左括号都已被匹配,则字符串有效;否则,字符串无效。

示例:

  1. s = "()",有效,因为左括号和右括号一一匹配。
  2. s = "()[]{}",有效,因为左括号和右括号一一匹配,且遵循正确的闭合顺序。
  3. s = "(]",无效,因为右括号没有与之匹配的左括号。
  4. s = "([)]",无效,因为右括号的顺序不正确。

参考代码:

def is_valid(s):
    stack = []
    for char in s:
        if char in "([{":
            stack.append(char)
        else:
            if not stack:
                return False
            top = stack.pop()
            if (top == "(" and char != ")") or (top == "{" and char != "}") or (top == "[" and char != "]"):
                return False
    return not stack

# 测试
print(is_valid("()"))  # True
print(is_valid("()[]{}"))  # True
print(is_valid("(]"))  # False
print(is_valid("([)]"))  # False

总结:
栈是数据结构中非常基础和重要的内容,这道题也是基础级别的栈应用题,希望大家能够通过本题的学习,掌握栈的基本应用技巧,当然,栈的应用非常广泛,大家需要通过学习更多的内容去扩展对栈的应用。