思路
-
定义一个递归函数递归函数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;
};