这题关键就是读题之后处理出来两个基本结论:
- 任意前缀中左括号的数量都要大于或等于右括号数量
- 左右括号数量相等
利用这两个基本结论,我们可以每次放置左括号的条件是当前左括号的数目不超过n
,每次可以放置右括号的条件是当前右括号的数目不超过左括号的数目。
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);
else {
//添加左括号,只要当前左括号数量小于n就可以
if(lc < n) dfs(n,lc + 1,rc,seq+"(");
//添加右括号,不仅需要当前右括号数量小于n 同时还需要左括号数量大于右括号
if(rc < n && lc > rc) dfs(n,lc,rc+1,seq+")");
}
}
};