runtimegroup / puzzle

刷题

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

括号生成

liuguanyu opened this issue · comments

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例:

输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]

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

/**
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function(n) {
    var res = []

    var _g = (ls, rs, stack) => {
        if (ls == rs && ls == n){
            res.push(stack)
            return
        }
        if (ls < n){
            _g(ls+1, rs, stack + '(')
        }
        if (rs < ls){
            _g(ls, rs+1, stack + ')')
        }
    }

    _g(0, 0, "")

    return res
};
/**
 * @param {number} n
 * @return {string[]}
 */
// dfs
// var generateParenthesis = function(n) {
//     function traceBracket(l, r, temp, result) {
//         if (r == 0) {
//             result.push(temp)
//             return
//         }
//         if(l < r) {
//             traceBracket(l, r-1, temp + ')', result)
//         }
//         if (l > 0) {
//             traceBracket(l-1, r, temp + '(', result)
//         }
//     }
//     const res = []
//     traceBracket(n, n, '', res)
//     return res
// };
var generateParenthesis = function(n) {
    const res = [['']]

    for(let i = 1; i<n+1; i++) {
        const cur = []
        for(let j = 0; j < i; j++) {
            const left = res[j]
            const right = res[i - 1 - j]
            left.forEach(function(s1) {
                right.forEach(function(s2) {
                    cur.push(`(${s1})${s2}`)
                })
            })
        }
        res[i] = cur
    }
    return res[n]
};

yuque_diagram