res = []defdfs(l,r,s):if l > n or r > n:returnif (l == r == n): res.append(s)# 剪枝,提高算法效率if l < r:return# 加一个左括号dfs(l +1, r, s +'(')# 加一个右括号dfs(l, r +1, s +')')dfs(0, 0, '')return res
由于字符串的不可变性, 因此我们无需撤销 s 的选择。但是当你使用 C++ 等语言的时候, 就需要注意撤销 s 的选择了。类似:
s.push_back(')');
dfs(l, r + 1, s);
s.pop_back();
关键点
当 l < r 时记得剪枝
代码
语言支持:JS,Python3,CPP
JS Code:
/** * @param{number} n * @return{string[]} * @param l 左括号已经用了几个 * @param r 右括号已经用了几个 * @param str 当前递归得到的拼接字符串结果 * @param res 结果集 */constgenerateParenthesis=function (n) {constres= [];functiondfs(l, r, str) {if (l == n && r == n) {returnres.push(str); }// l 小于 r 时不满足条件 剪枝if (l < r) {return; }// l 小于 n 时可以插入左括号,最多可以插入 n 个if (l < n) {dfs(l +1, r, str +"("); }// r < l 时 可以插入右括号if (r < l) {dfs(l, r +1, str +")"); } }dfs(0,0,"");return res;};
Python Code:
classSolution:defgenerateParenthesis(self,n:int) -> List[str]: res = []defdfs(l,r,s):if l > n or r > n:returnif (l == r == n): res.append(s)if l < r:return# 加一个左括号dfs(l +1, r, s +'(')# 加一个右括号dfs(l, r +1, s +')')dfs(0, 0, '')return res