标签:
想着用动态规划的方法,有点类似于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]; } };
还有种用递归的简洁方法:
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 };
标签:
原文地址:http://www.cnblogs.com/vaecn/p/5375081.html