leetcode 22 括号生成

说实话有点难,看了题解才有一定的思路,最初的思路就是暴力递归,通过撰写判断函数的方式来进行是否正确的判断。实在是太暴力了,以至于都有点不好意思写,所以一直在想怎么在生成的过程中排除所有的错误序列。可以通过记录左右括号的数量与括号对数的关系来实现,必须要满足的是,在生成的每一步中,必须满足左括号值小于对数,右括号值小于等于左括号数,实现这个步骤就能实现正确。随便举几个错误的例子就能够发现,一定是在生成的过程中违反了这两个条件。递归中先加上左右括号再消除的方式很巧妙,减少了内存消耗。贴代码

 1 class Solution {
 2 public:
 3     vector<string> res;
 4     vector<string> generateParenthesis(int n) 
 5     {
 6         string res_temp;
 7         generate(res_temp,0,0,n);
 8         return res;
 9     }
10     void generate(string& res_temp,int left,int right,int n)
11     {
12         if(res_temp.size() == n*2)
13         res.push_back(res_temp);
14         if(left<n)
15         {
16             res_temp.push_back('(');
17             generate(res_temp,left+1,right,n);
18             res_temp.pop_back();
19         }
20         if(right<left)
21         {
22             res_temp.push_back(')');
23             generate(res_temp,left,right+1,n);
24             res_temp.pop_back();
25         }
26     }
27 };

还有一种很好的递归方法,每一个序列都可以被表示为(a)+b的结构,a和b分别为合法的括号序列。代码中主要的问题是变量的类型,本来想用一个二维数组来存放所有的序列,结果发现不现实,所以还是采用了题解中的一个指针数组的方法。贴代码

 1 class Solution {
 2 public:
 3     shared_ptr<vector<string>> res[9];
 4     vector<string> generateParenthesis(int n) 
 5     {        
 6         return *generate(n);       
 7     }
 8     shared_ptr<vector<string>> generate(int n)
 9     {
10         if(res[n]!= nullptr)
11         return res[n];
12         if(n == 0)
13         {
14             res[0] = shared_ptr<vector<string>>(new vector<string>{""});;
15         }
16         else
17         {
18             auto res_temp = shared_ptr<vector<string>>(new vector<string>);
19             for(int i = 0 ; i < n ; i++)
20             {
21                 int j = n-1-i;
22                 auto left = generate(i);
23                 auto right = generate(j);
24                 for (const string& left_temp : *left)
25                 {
26                     for (const string& right_temp : *right)
27                     {
28                         res_temp->push_back("("+left_temp+")"+right_temp);
29                     }
30                 }
31             } 
32             res[n] = res_temp;
33         }
34         
35         return res[n]; 
36     }
37 };

 

posted @ 2021-08-20 17:05  zhaohhhh  阅读(40)  评论(0)    收藏  举报