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 };

浙公网安备 33010602011771号