全球每年有超过200万程序员在LeetCode上刷题,而第20题"有效的括号"是被提交次数最高的题目之一。它看似简单,却藏着计算机科学中最优雅的数据结构应用。
这道题的设定很直接:给你一个只包含六种字符的字符串——圆括号()、花括号{}、方括号[],判断它们的排列是否"合法"。什么算合法?三个硬性标准:开闭必须同类型、嵌套顺序不能乱、不能有落单的符号。
举个例子。"{[()]}"是合法的:大括号包中括号,中括号包小括号,层层嵌套但顺序正确。但"{[)}]"就不行——虽然符号都在,但中括号被圆括号强行打断,破坏了嵌套结构。再比如"([)]",两个开括号按顺序出现,但闭括号却交换了顺序,这也违规。
人眼扫一眼就能判断的东西,计算机该怎么理解?关键在于"期待"机制。当你读到"{"时,大脑自动标记:现在需要一个"}"。接着读到"[",优先级更新:先等"]",再等大括号。这种"最后打开的最先关闭"的逻辑,正是栈(Stack)的核心特性。
栈是一种后进先出(LIFO)的数据结构,像一摞盘子:只能从上往下取,最后放上去的最先被拿走。应用到括号匹配上,算法流程变得清晰:遇到开括号就压入栈顶;遇到闭括号就检查栈顶是否匹配——匹配则弹出,不匹配直接判定失败。遍历结束后,栈必须为空才算合法。
这道题的巧妙之处在于,它没有复杂的数学计算,却考验对问题本质的抽象能力。很多初学者第一反应是用计数器统计每种括号的数量,但"([)]"这种案例会直接击穿这种思路。栈结构强制维护了"嵌套顺序"这一关键约束,让代码简洁而可靠。
从面试角度看,这道题的价值在于展示基础功。面试官关注的不是你写出了答案,而是能否清晰解释为什么栈是最优解——时间复杂度O(n),空间复杂度O(n),没有更优的通用解法。这种对数据结构特性的精准把握,才是算法能力的真正体现。
热门跟贴