给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
此题时卡特兰数的一个应用。抓中重点:只有右括号数量大于左括号时才能在尾部插入右括号
class Solution {
public:
void fun(vector<string>& v,string s,int l,int r){//一定要注意此处v是引用,否则改变的只是v的副本
if(l==0&&r==0){//l表示左括号数量,r表示右括号数量
v.push_back(s);
}
if(l>0){
fun(v,s+'(',l-1,r);
}
if(r>0&&l<r){//只有右括号数量大于左括号时才能在尾部插入右括号
fun(v,s+')',l,r-1);
}
}
vector<string> generateParenthesis(int n) {
vector<string> v;
string s;
fun(v,s,n,n);
return v;
}
};