「括号生成」提醒我们:多占一格空间,有时是在为时间买路。
------ 耶夫托维斯基
Hello,大家好,今天继续刷 LeetCode 热题 100。
这篇要解决的是 22. 括号生成。
前言
「括号生成」的核心不在代码量,而在于找到正确的数据结构、状态定义或遍历顺序。下面按题目、思路、代码和复杂度把它一步步拆开。
1、题目描述
给定 n,生成所有由 n 对括号组成的有效括号组合。
2、解题思路
回溯时记录已使用的左、右括号数。左括号还没用完就能继续放;右括号只有在 right < left 时才能放,这个不变量保证任意前缀都不会出现右括号更多的非法情况。长度达到 2 * n 时收集答案。
3、代码实现
js
var generateParenthesis = function(n) {
const ans = [];
const dfs = (left, right, path) => {
if (path.length === 2 * n) return ans.push(path);
if (left < n) dfs(left + 1, right, path + '(');
if (right < left) dfs(left, right + 1, path + ')');
};
dfs(0, 0, '');
return ans;
};
4、复杂度分析
时间为卡特兰数规模,递归空间 O(n)。
5、思路总结
- 核心方法:回溯时记录已使用的左、右括号数
- 关键点:左括号还没用完就能继续放
- 实现提醒:右括号只有在
right < left时才能放,这个不变量保证任意前缀都不会出现右括号更多的非法情况
结语
以上就是「括号生成」的解法。先把关键状态和不变量想清楚,再落到代码,复杂问题也会清晰很多。