问题描述:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
解题思路:深度优先遍历 + 条件筛选
- 这类似一个二叉树结构,每次可以选择"(“或者”)",找符合条件的有效括号组合
- 通过深度优先遍历可以找出所有路径,一个路径上的节点数为n*2
- 判断路径是否有效,即一个路径上的"(“数量 > n, 或者”)“数量 >n, 或者”)"数量 > "("数量时,这条路径无效
代码实现(js)
/**
* @param {number} n
* @return {string[]}
*/
var generateParenthesis = function(n) {
// 边界判断
if(n <= 0) return []
let res = []
// path表示当前路径,left, right分别表示左括号和右括号的数量
const dfs = (path, left, right) => {
// 如果左括号,右括号的数量大于n, 不合规则
if(left > n || right > n || right > left){
return
}
if(path.length === n * 2){
res.push(path)
return
}
// 递归调用时,作用括号的数量对应+1
dfs(path + '(', left + 1, right)
dfs(path + ')', left, right + 1)
}
// 调用函数
dfs('', 0, 0)
return res
};