题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
来源:LeetCode
思路
采用深度优先搜索。最初是一个空串,每次往后追加一个左括号或右括号,直到字符串的长度达到2n。
需要注意的是右括号的数目不能大于左括号,即右括号不能先与左括号追加上去,否则生成的组合是无效的。
解法
/**
* @param {number} n
* @return {string[]}
*/
const generateParenthesis = n => {
const result = [];
const dfs = (string, leftCount, rightCount) => {
if (string.length === 2 * n) {
result.push(string);
return;
}
if (rightCount < leftCount) {
dfs(`${string})`, leftCount, rightCount + 1);
}
if (leftCount < n) {
dfs(`${string}(`, leftCount + 1, rightCount);
}
};
dfs('', 0, 0);
return result;
};