括号生成:递归 + 定义基础“( + left + )+ right”

140 阅读1分钟

思路

  • 定义一个递归函数递归函数generateParenthesis(n)

  • 输入一个n,返回一个每项都包含长度为2n的括号字符串,即n对儿括号的数组

  • 当n为0的时候返回[""],当n为1的时候返回["()"],当n为2的时候返回["()()","(())"]

    • 可以发现规律,将"()"看做是一个最基础的组件,多个括号的拼接看做是"()"的拼接(包含嵌套拼接)
    • 我们定义两个变量,left和right,最后返回的结果数组的每一个拼接项都 = "( + left + ) + right"
    • left的值为递归函数generateParenthesis(i)生成的数组后遍历得到的每一项(0 ≤ i < n)
    • right的值为递归函数generateParenthesis( n - 1 -i)生成的数组后遍历得到的每一项(0 ≤ i < n)

    注意,n-1-i+i=n-1,确保left和right的括号数量加起来是等于n对括号的。

题目

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

示例 1:

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

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

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

示例 1:

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

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

代码

/**
 * @param {number} n
 * @return {string[]}
 */
var generateParenthesis = function(n) {
    let arr = [];
    if(n === 0) return [""]
    let thesisArr = [];
    for(let i = 0;i < n;i++) {
        for(let left of generateParenthesis(i)) {
            for(let right of generateParenthesis( n -1 -i)) {
                thesisArr.push('('+ left +')'+ right)
            }
        }
    }
    return thesisArr;


    return arr;
};