单括号匹配算法:核心原理与 C++ 高效实现
在编译器语法校验、表达式合法性判断等底层场景中,括号匹配是基础且关键的一环。单括号匹配问题剥离了复杂的类型干扰,仅保留一对小括号的序列判断,却能直观体现「平衡思想」与「代码优化」的本质。本文将深入解析其核心逻辑、算法原理,并给出 C++ 的极致实现。
一、问题本源:何为合法的单括号序列?
我们聚焦仅包含小括号 ( 和 ) 的字符串序列,判断它是否「合法」。所有解法的根基在于两条铁律:
1. 核心判定准则
- 过程平衡:遍历序列的任意位置,左括号的累计数量必须 ≥ 右括号(绝不允许提前出现多余的右括号);
- 最终平衡:遍历完整个序列后,左括号总数 = 右括号总数(无多余未闭合的左括号)。
满足以上两条即为完美合法的括号序列,违背任意一条均为非法。
2. 直观示例
- ✅ 合法序列:
(())、()()、((())) - ❌ 非法序列:
())(右括号过多)、((()(左括号多余)、)()(开头即非法)
二、思维演进:从朴素思路到极致优化
1. 原始思路:双计数器法
最朴素的想法是用两个变量分别记账:定义 left 统计左括号,right 统计右括号。遍历每个字符,遇到 ( 则 left+1,遇到 ) 则 right+1。每一步检查 left ≥ right,结束检查 left == right。
这个思路虽好理解,但存在冗余——我们不需要同时存储两个数值,只需要关注它们的差值即可。
2. 优雅优化:单计数器法
这是单括号匹配的最优解,核心是用一个变量记录「平衡状态」,彻底精简空间与逻辑:
- 定义变量
balance(平衡值),初始值为0; - 遇到左括号
(→ 平衡值+1(代表待匹配的左括号 +1); - 遇到右括号
)→ 平衡值-1(代表匹配掉一个左括号); - 遍历中:若
balance < 0→ 右括号过量,直接非法; - 遍历后:若
balance == 0→ 完全平衡,合法。
三、图形化拆解:算法执行全过程
我们通过两个经典案例,可视化平衡值的变化,一眼看懂原理。
案例 1:合法序列 ( () () )
| 步骤 | 字符 | 平衡值变化 | 状态判断 |
|---|---|---|---|
| 1 | ( | 0 → 1 | ✅ ≥0 |
| 2 | ( |


