leetcode 22题 括号生成

122 阅读1分钟

题目: 数字 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);
};