生成n个独立的()
,然后把最后一个往前面扔(重复这个过程)
但是不好实现
n+1可以理解为比n项多了一个括号,所以把n项放在括号里面p项和外面q项排列;p和q就转化成了子问题。但是要注意p和q的顺序是固定的,可以是p(q)、(p)q,但是为了保持不对称来避免重复项不能是pq()、()pq
class Solution { public: vector<string> generateParenthesis(int n) { vector<vector<string>> brc; brc.push_back({""}); brc.push_back({"()"}); for(int i=2;i<=n;i++){ vector<string> t; //利用n-1组合拼出n for(int a=0;a<i;a++){//a+b=n-1(p+q=n-1) int b=i-1-a; vector<string> p(brc[a]); vector<string> q(brc[b]); for( auto ps:p){ for( auto qs:q){ string ss="("; ss=ss+ps+")"+qs;//(p)+q t.emplace_back(ss); } } } brc.push_back(t); } return brc[n]; } };