括号生成

给出 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的时候,说明所填充的数据是合适的,然后将其放入列表,停止向下填充并向上回溯另一条路线。

来源:https://leetcode-cn.com/problems/generate-parentheses/solution/gua-hao-tai-fu-za-shu-zi-zhuan-hua-ta-by-da-lian-m/

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/panjingshuang/p/11664825.html