class Solution {
public:
vector<string> ans;
vector<string> generateParenthesis(int n) {
function<void(int,int,int,int,vector<char>)> dfs=[&](int l,int r, int capcityL,int capcityR,vector<char> v){
if(capcityL==0 && capcityR==0){
string s;
for(auto c:v){
s+=c;
}
ans.push_back(s);
}
else if(v.empty() || l==r){
if(capcityL>0){
v.push_back('(');
dfs(++l,r,--capcityL,capcityR,v);
}
}else if(l>r && capcityL==0){
v.push_back(')');
dfs(l,++r,capcityL,--capcityR,v);
}
else if(l>r && capcityL>0){
//选左括号
vector<char> v1=v;
v1.push_back('(');
dfs(++l,r,--capcityL,capcityR,v1);
l--;capcityL++;
//选右括号
vector<char> v2=v;
v2.push_back(')');
dfs(l,++r,capcityL,--capcityR,v2);
}
};
vector<char> res;
dfs(0,0,n,n,res);
return ans;
}
};
回溯、一种if里面有多种情况时要记得把变量减掉