LC28 Generate Parentheses

想着用动态规划的方法,有点类似于n*n的网格,从(0,0)开始走到(n-1,n-1)有几种方法。当然必须满足纵坐标大于等于横坐标,还有必须记录到达每一个点所走的方法(这里指的是有多少不同的字符串)。

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> result;
        if(n<=0)
            return result;
        vector<vector<string> > prev(n+1,vector<string>());
        
        string s1="(";
        string s2=")";
        for(int i=1;i<=n;i++)
        {
            vector<vector<string> > rear(n+1,vector<string>());
            if(prev[0].size()!=0)
                rear[0].push_back(prev[0][0]+s1);
            else if(prev[0].size()==0)
                rear[0].push_back(s1);
            for(int j=1;j<i;j++)
            {
                for(int k=0;k<prev[j].size();k++)
                    rear[j].push_back(prev[j][k]+s1);
                for(int k=0;k<rear[j-1].size();k++)
                    rear[j].push_back(rear[j-1][k]+s2);
            }
            for(int k=0;k<rear[i-1].size();k++)
                rear[i].push_back(rear[i-1][k]+s2);
            swap(prev,rear);
        }
        return prev[n];
    }
};
View Code

还有种用递归的简洁方法:

 1 class Solution {
 2 public:
 3     vector<string> generateParenthesis(int n) {
 4         vector<string> res;
 5         addingpar(res, "", n, 0);
 6         return res;
 7     }
 8     void addingpar(vector<string> &v, string str, int n, int m){
 9         if(n==0 && m==0) {
10             v.push_back(str);
11             return;
12         }
13         if(m > 0){ addingpar(v, str+")", n, m-1); }
14         if(n > 0){ addingpar(v, str+"(", n-1, m+1); }
15     }
16 };
View Code

 

posted @ 2016-04-10 19:37  vaevaevae  阅读(158)  评论(0编辑  收藏  举报