算法39 leetcode22. 括号生成

开始的想法

生成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];    
    }
    
};
原文地址:https://www.cnblogs.com/impw/p/15733255.html