题目描述
给定n对括号,编写一个函数来生成正确括号的所有组合。
例如,给定n = 3,解决方案集合为:
“((()))”,“(()())”,“(())()”,“()(())”,“()()()”
/*
采用递归
每次左括号比右括号多时可以加左括号或者右括号
如果左括号等于右括号则只能加左括号
左括号够了那就只加右括号
右括号够了那就只加左括号
*/
void generate(vector<string>&v,int x,int y,string s){
if(x==0&&y==0){
v.push_back(s);
return;
}
if(x==0&&y>0){
generate(v,x,y-1,s+")");
return;
}
if(y==0&&x>0){
generate(v,x-1,y,s+"(");
return;
}
if(x<y){//左括号比右括号多,既可以(又可以)
generate(v,x-1,y,s+"(");
generate(v,x,y-1,s+")");
return;
}
if(x>=y){
generate(v,x-1,y,s+"(");
return;
}
}
vector<string> generateParenthesis(int n) {
vector<string>ret;
string s="";
generate(ret,n,n,s);
return ret;
}