题意:

  产生n对合法括号的所有组合,用vector<string>返回。

 

思路:

  递归和迭代都可以产生。复杂度都可以为O(2n*合法的括号组合数),即每次产生出的括号序列都保证是合法的。

  方法都是差不多的,就是记录当前产生的串中含有左括号的个数cnt,如果出现右括号,就将cnt--。当长度为2*n的串的cnt为0时,就是答案了,如果当前cnt比剩下未填的位数要小,则可以继续装“(”,否则不能再装。如果当前cnt>0,那么就能继续装“)”与其前面的左括号匹配(无需要管匹配到谁,总之能匹配)。

 

  递归版本

 1 class Solution {
 2 public:
 3     void DFS(vector<string>& ans,string t,int cnt,int n)
 4     {
 5         if(n==0)    ans.push_back(t);
 6         if(cnt<n)    DFS(ans,t+"(",cnt+1,n-1);
 7         if(cnt>0)    DFS(ans,t+")",cnt-1,n-1);
 8     }
 9 
10     vector<string> generateParenthesis(int n)
11     {
12         vector<string> ans;
13         DFS(ans,"",0,n*2);
14         return ans;
15     }
16 };
AC代码

相关文章: