有效的括号
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串,我们需要判断这个字符串是否有效。一个有效的字符串必须满足两个基本条件:首先,每一个左括号都必须有一个相同类型的右括号与之对应并闭合;其次,括号的闭合顺序必须是正确的,也就是说,最后开启的括号必须最先被闭合。这就像是在编写代码时,我们必须保证每一个函数、对象或数组的定义都能正确地“对齐”,否则代码逻辑就会混乱。
思路分析
处理括号匹配问题最直观的工具就是“栈”这一数据结构。由于括号具有天然的嵌套属性,最近开启的左括号往往是接下来最需要被闭合的。当我们遍历字符串时,每遇到一个左括号,就把它存入栈中,代表这是一个“待解决”的承诺;而每当遇到一个右括号,我们就去查看栈顶最靠近的那条承诺,看它们是否类型一致。如果类型匹配,则将栈顶元素弹出,标志着这一对括号成功“销结”。如果遍历结束时,所有的承诺都已兑现,即栈恢复为空,那么这个字符串就是有效的。
除了使用栈的方案,还有一种非常形象的方法叫做“扫描替换法”。想象一下,如果一个字符串是有效的,它内部一定至少存在一对紧密相邻的完整括号,例如 ()、[] 或 {}。我们可以像消除类游戏一样,不断在字符串中寻找这些成对的最小单元并将其删除。删除后,原本被隔开的括号可能会缩进并形成新的匹配对,我们继续重复这个过程。如果在某一步我们再也找不到可以消除的对子,而字符串依然不为空,那么它就是无效的。