括号生成
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
/** * @param {number} n * @return {string[]} */ var generateParenthesis = function(num) { let temp = []; var check = function(sum,arr){ if(arr.length === 2*num){ if(sum === 0){ var a = arr.slice().join('').replace(/-1/g,")").replace(/1/g,"("); temp.push(a); } return; } //当前位置数据是1 let value = sum +1; if(value >=0&& value<=num){ arr.push('1'); check(value,arr); arr.pop(); } //当前位置数据是-1 value = sum -1; if(value>=0&& value<=num){ arr.push('-1'); check(value,arr); arr.pop(); } } check(0,[]); return temp; };
实现方式:主要是使用回溯的方法,以n=3为例 ,有n个"("那么就有")"n个,总共有2n个位置需要填充,每个位置填充的时候,有两种情况 “(”和")”,我们可以使用1和-1来替换( 和),进行填充的时候,当所填充的所有位置的数据和小于0的时候,说明已经填充的数据的")"要多于"(",所以不再向下填充数据,减枝,当所填充的数据值超过了n的时候,说明“(”填充多了,也进行剪枝,当所填充的位置的个数等于2n的时候,说明所填充的数据是合适的,然后将其放入列表,停止向下填充并向上回溯另一条路线。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。