原题
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
let arr = [];
/**
* @param {number} left 左括号的数量
* @param {number} left 右括号的数量
* @param {string} str 括号组合
*/
const dfs = (left, right, str) => {
// 如果括号组合长度为 2n,字符串构建完成
if(str.length == 2 * n) {
arr.push(str); // 将字符串加入 arr
return; // 结束当前递归
}
if(left < n) dfs(left + 1, right, str + '(');
// 剪枝,如果右括号的数量小于左括号,添加右括号组合有效,否则组合无效。
if(right < left) dfs(left, right + 1, str + ')');
}
dfs(0, 0 , ''); // 递归入口
return arr;
};
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
let total = [[''], ['()']];
for(let i = 2; i <= n; i++) { // 第 i 对括号加入排列
let arr = []; // 记录 i 对括号的所有组合
for(let j = 0; j < i; j++) { // 遍历所有可能情况
// p1 和 p2 的括号数之和为 i-1
let p1 = total[j]; // p1 共 j 对括号的所有组合
let p2 = total[i - j - 1]; // p2 共 i-j-1 对括号的所有组合
for(let k1 = 0; k1 < p1.length; k1++) { // 遍历 p1 的每种情况
for(let k2 = 0; k2 < p2.length; k2++) { // 遍历 p2 的每种情况
arr.push('(' + p1[k1] + ')' + p2[k2]);
}
}
}
total.push(arr); // 添加 i 对括号的所有组合
}
return total[n];
};