力扣-22. 生成括号(Generate Parentheses)

力扣-22. 生成括号(Generate Parentheses)
solovedeng最后编辑于2025-07-13
22. 生成括号(Generate Parentheses)
Medium
给定 n 对括号,写一个函数生成所有由 n 对括号组成的合法(well-formed) 括号字符串。
示例 1:
输入: n = 3
输出: [("((()))","(()())","(())()","()(())","()()()")]
示例 2:
输入: n = 1
输出: [("()")]
约束:
1 <= n <= 8
解题思路(回溯 / 递归)
这类“列出所有组合”的题型常用 回溯(Backtracking)。对于生成合法括号,关键在于维护左右括号剩余数量,并保证任何时刻已生成的前缀都是合法的(即左括号剩余数不能大于右括号剩余数,否则会出现以 ) 开头或中途负平衡的情形)。
定义递归函数 dfs(left, right, cur):
left:当前还能放的左括号数量(’(‘)。right:当前还能放的右括号数量(’)’)。cur:当前构造的字符串。
递归规则:
- 若
left > right,说明前缀不合法(右括号比左括号先用完),直接返回。 - 若
left == 0 && right == 0,则cur为一个完整合法解,加入结果集。 - 若
left > 0,可以放一个左括号:dfs(left-1, right, cur+'(')。 - 若
right > 0,可以放一个右括号:dfs(left, right-1, cur+')')。
该方法复杂度与卡塔兰数相关,生成结果数为第 n 个卡塔兰数,符合题目规模限制(n <= 8)。
方法一:标准回溯(推荐)
1 | class Solution { |
方法二:基于已有解的插入法(使用集合去重)
- 思路来自于构造法:由
n-1的所有合法解,在每个字符串的任意一个左括号后插入一对(),或在开头插入(),然后用集合去重得到n的所有解。 - 该方法可用作思路拓展,但需要集合去重来避免重复。
1 | class Solution { |
作者想说的话:
生成括号是回溯的典型题,关键在于维护可用左右括号数量并及时剪枝(left > right 时剪掉不合法前缀)。回溯方法直观、效率高且易于理解;插入法是有趣的构造思路,但需要额外去重。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果


