题目:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
解题思想: 在我们添加第i个括号时,那么i之前有i-1个括号,我们可以把i-1个括号分为两部分,一部门放入新增的括号中,一部分放入新增括号右边。那么组合起来就组成了i个括号的所有组合形式。
查看下面规律:
0 []
1 ['()']
2 ['(()))','()()']
3 ['()(())','()()()', 中间有0个括号,右边2个括号 '(())()', 中间有1个括号,右边1个括号 '((())))','(()())' 中间有2个括号,右边0个括号 ]
使用Map映射来保存1个括号,2个括号,3个括号 ...,n个括号的组合方式的所有情况。
var generateParenthesis = function(n) {
if(n==0) return [];
let data = new Map();
data.set(0,['']); //保存括号数对应的组合方式
//有多组括号或一个括号
for(let i=1;i<=n;i++){
let res = [];//初始化i个括号时的数组
//遍历新增括号的中间可能插入的括号个数
for(let j=0 ; j <= i-1 ; j++){
let center = data.get(j);//中间括号组合
let right = data.get(i-1-j);//右侧括号组合
//遍历中间括号的所有情况
for(let m=0;m<center.length;m++){
//遍历右侧括号的所有情况
for(let k=0;k<right.length;k++){
res.push(`(${center[m]})${right[k]}`);
}
}
}
data.set(i,res);//将i个括号的组合存入data的Map()中
}
return data.get(n);
};