今天的题目如下:
这道题目是给出n对圆括号,写一个函数去生成由所有合法匹配的组合生成的数组。
首先想到的是将所有的组合罗列出来,并分别校验组合是否合法,但是这种方法可能就会导致比较不好的时间复杂度了。那么就要想想什么情况会是合法的确情况了。
假设左括号数为 lnum, 右括号数为 rnum ,如果左括号数目比右括号数目多的话,那么组合还是有可能合法的,反之,组合就是不合法的。根据这个指导方向,有下面代码:
1 /** 2 * @param {number} n 3 * @return {string[]} 4 */ 5 var generateParenthesis = function(n) { 6 var res = new Array(); 7 var lnum = 0, rnum = 0; 8 9 findCombination('(', res, 1, 0, n) 10 11 return res; 12 }; 13 14 15 var findCombination = function(ss, res, lnum, rnum, n){ 16 if(ss.length > 2*n || lnum < rnum || lnum > n || rnum > n){ 17 return; 18 } 19 20 if(ss.length == 2*n - 1 && lnum >= rnum && lnum <= n && rnum <= n){ 21 res.push(ss+')'); 22 }else{ 23 findCombination( ss + '(' , res, lnum + 1, rnum, n); 24 25 findCombination( ss + ')' , res, lnum, rnum + 1, n); 26 } 27 };
感谢DFS,让我能够不看答案就做出了这题。