# 括号生成 数字`n`代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。 ## 示例 ``` 输入:n = 3 输出:[ "((()))", "(()())", "(())()", "()(())", "()()()" ] ``` ## 题解 ```javascript /** * @param {number} n * @return {string[]} */ var generateParenthesis = function(n) { var target = []; dfs(0, 0, "", target, n); return target; }; function dfs(startCount, endCount, str, target, n){ if(str.length === n*2) { target.push(str); return 0; } if(startCount < n) dfs(startCount + 1, endCount, str + "(", target, n); if(endCount < startCount) dfs(startCount, endCount + 1, str + ")", target, n); } ``` ## 思路 使用回溯法,上述代码中`startCount`代表左括号的数量,`endCount`代表右括号的数量,`str`是缓存字符串,`target`是目标数组,`n`是括号对数数量。当进行递归时,判断在左括号数量`startCount`数量小于`n`的情况下,可以在缓存字符串加入`(`并将`startCount + 1`然后传递参数进行下一次递归,在右括号的数量少于左括号的情况下,那么可以在缓存字符串中加入`)`并将`endCount + 1`然后传递参数进行下一次递归,当字符串的长度等于`n*2`时结束递归并将缓存字符加入目标数组。 ## 每日一题 ``` https://github.com/WindrunnerMax/EveryDay ``` ## 题源 ``` https://leetcode-cn.com/problems/generate-parentheses/ ```