[Leetcode]括号生成-递归回溯
题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例:
输入:n = 3
输出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题思路
- 递归回溯
画图以后,可以分析出的结论:
- 当前左右括号都有大于 0 个可以使用的时候,才产生分支;
- 产生左分支的时候,只看当前是否还有左括号可以使用;
- 产生右分支的时候,还受到左分支的限制,右边剩余可以使用的括号数量一定得在严格大于左边剩余的数量的时候,才可以产生分支;
- 在左边和右边剩余的括号数都等于 0 的时候结算。
代码实现
class Solution {
public:
vector<string> res;
vector<string> generateParenthesis(int n) {
if(n==0)
return res;
dfs(n,n,"");
return res;
}
void dfs(int x,int y,string ans){
if(x==0&&y==0){//递归结束条件
res.push_back(ans);
return;
}
if(x>y)//剪枝,剩下的左括号数量小于右括号。意味着已经组成的字符串中,右括号数量比左括号多,可剪枝
return;
if(x>0)
dfs(x-1,y,ans+"(");
if(y>0)
dfs(x,y-1,ans+")");
}
};