题意:
产生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 };