22. 括号生成
1.深度优先搜索
-
本题官方题解的思路我总觉得有点der,我这里尝试用深度优先搜索的方式完成。搜索方式简单概括起来就是:试探性地加入左、右括号,在正好匹配时记录结果;并且在超出边界时结束搜索。
-
我在这里设置了四个搜索的参数:
- num_left,这一步的左括号数量
- num_right,这一步的右括号数量
- num_left_before,这一参数是关键,和括号匹配中的栈相似,记录等待着被匹配的左括号数。
- s,当前的字符串结果
-
每次试探性的加入左括号,等待匹配的左括号+1;再次试探性的加入右括号,等待匹配的左括号-1;
-
跳出条件:如果左右括号超出给出的n,应当跳出。但是尤其要注意num_left_before的数字,如果num_left_before<0就说明这之前的括号匹配失败了,这之后无论如何都不会有合格的结果。
-
class Solution { public: vector<string> result; int num_max; void dfs(int num_left,int num_right,string s,int num_left_before){ //在已有左括号全部匹配,现有左、右括号都正好是要求数量,插入结果 if(num_left_before==0&&num_left==num_max&&num_right==num_max){ result.push_back(s); return; } //在已有左括号被过度匹配,或者现有左、右括号超出要求数量,直接结束返回 if(num_left_before<0||num_right>num_max||num_left>num_max){ return; } dfs(num_left+1,num_right,s+"(",num_left_before+1);//试探性地给结果一个左括号,已有左括号+1 dfs(num_left,num_right+1,s+")",num_left_before-1);//试探性地给结果一个右括号,已有左括号-1 } vector<string> generateParenthesis(int n) { num_max=n; dfs(1,0,"(",1); return result; } };