题意
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
样例
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
思路
1.递归树---所有的结果,构成了一棵树。
递归树一般套路
a.先找到结束递归的条件
b.找到如何向下(进入下一层递归)遍历的条件
c.找到如何想左右遍历
d.考虑需不需要回溯---场景重现
2.递归的结束的条件一般是什么?
层数为判断依据----全排列
自身的个数为判断依据---括号生成
还有其他的,总结的重要性可想而知,我突然想到了为什么需要数据,数据只是数据,而在于如何使用他做一些有规则的事情。
3.本题,有两个规则至关重要
I 组合中左括号的数量=右括号的数值
II 组合中任意位置右括号的数量<=左括号的数量
II 解释,组合中任意位置的右括号数量不大于左括号的数量
class Solution {
public:
vector<string> str;
vector<string> generateParenthesis(int n) {
dfs(n,0,0,"");
return str;
}
void dfs(int n,int l,int r,string s){
if (l == n && r == n){//满足条件,返回
str.push_back(s);
return ;
}
if (l < n) dfs(n,l+1,r,s + "(");
if (r < l) dfs(n,l,r+1,s + ")");
}
};