返回

用栈巧解 LeetCode 有效括号难题

前端

引子

在 LeetCode 这道经典的“有效括号”题目中,我们面临的挑战是判断给定字符串中的括号是否成对出现。这是一个常见的编程问题,也是面试官衡量求职者数据结构和算法技能的试金石。在本篇文章中,我们将借助栈这一强大的数据结构,深入解析如何高效解决这一难题。

了解栈数据结构

栈是一种遵循“后进先出”(LIFO)原则的数据结构。这意味着最后放入栈中的元素将第一个被移除。栈在计算机科学中有着广泛的应用,例如用于平衡括号、语法分析和函数调用。

借助栈解决有效括号问题

要利用栈解决有效括号问题,我们首先要遍历给定的字符串。对于字符串中的每个字符,我们根据以下规则进行操作:

  • 如果字符是左括号,则将其压入栈中。
  • 如果字符是右括号,则检查栈是否为空。如果栈为空,表明右括号没有与之匹配的左括号,因此返回 false。否则,弹出栈顶元素,并检查它是否与当前右括号匹配。如果匹配,则继续处理下一个字符;如果不匹配,则返回 false。

代码示例

def is_valid(s):
    stack = []
    for char in s:
        if char in "([{":
            stack.append(char)
        elif char in ")]}":
            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

优化算法

为了优化算法,我们可以通过使用哈希表来存储括号的匹配关系。这样,当我们遇到一个右括号时,就可以直接通过哈希表查找其匹配的左括号,从而减少搜索时间。

拓展应用

栈在解决其他问题中也扮演着重要的角色。例如:

  • 平衡二叉树:判断二叉树中的左右子树高度差是否超过 1。
  • 中缀表达式求值:将中缀表达式转换为后缀表达式并求值。
  • 函数调用:存储函数调用栈,实现函数嵌套。

总结

通过利用栈的数据结构,我们可以高效地解决 LeetCode 中的“有效括号”问题。这种方法简单易懂,并且可以扩展到其他类似的问题。理解并掌握栈的使用,将极大地增强我们在编程中的问题解决能力。