这题是通过暴搜来做的。
这种只包含小括号的题目有两个性质
1.任意前缀中左括号的数量大于等于右括号的数量
2.左括号数量等于右括号的数量
这题简单,不用单独画递归搜索树
我们可以考虑什么时候能填左括号,什么时候能填右括号
1.左括号的条件:只要小于n便能填左括号
2.右括号田间:小于n而且要小于左括号的数量,因为当右括号等于左括号的数量时,这时就会少了左括号与右括号匹配。
步骤:
1.确定答案数组
2.递归求取答案
3.递归函数:
如果左括号等于右括号等于n,就存到答案数组中去
否则就按条件一直递归
1.左括号的条件:只要小于n便能填左括号
2.右括号田间:小于n而且要小于左括号的数量,因为当右括号等于左括号的数量时,这是暴搜的右括号的数量就会大于左括号的数量与性质一不符
3.只要当前分支不会影响兄弟分支,就不需要恢复现场,所以不用回溯
class Solution {
public:
vector<string>res;
vector<string> generateParenthesis(int n) {
dfs(n,0,0,"");
return res;
}
void dfs(int n,int lc,int rc,string seq){
if(lc==n&&rc==n)res.push_back(seq);
if(lc<n)dfs(n,lc+1,rc,seq+'(');
if(rc<n&&rc<lc)dfs(n,lc,rc+1,seq+')');
}
};