给出 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; } };