Leetcode 热题HOT 100 22.括号生成
题目
一、题目解析
根据题意可知,对于给定的数字,我们要输出合法的括号对的组合,刚开始想的是用栈来解决,发现根本行不通,然后看了一些大佬的题解,发现我们可以通过深度搜索来解决,因为从空串,一直不断的搜索下去,最终会形成一棵满二叉树,如图所示:
但是,这样出的有的结果是不符合要求的,是不合法的,所以我们还有在这个深搜函数中进行过滤。
二、过程解析:
对于这道题的题解我分解成如下四个部分来解决:
①:定义动态字符数组S来储存返回的括号对组合;
②:dfs()函数参数的定义,第一个参量字符数组S1,用来存放每个合法的括号对组合,第二和第三个参数分别为left和right,分别表示左括号和右括号的数目,第四个参数题目中给定的数字n;
③:边界的判断和不合法括号对的删除:
边界判断:当left+right==2*n,即左右括号数目之和为传入数字的两倍相等时,S字符数组存入此时S1字符数组内的合法括号,并结束本次搜索;
不合法括号对的删除:当right>left,right>n,left>n,此时出现的结果都是不合法的,我们需要提前结束这样的搜索。
代码展示:
代码如下:
class Solution {
public:
vector<string>s;
vector<string> generateParenthesis(int n) {
dfs("",0,0,n);
return s;
}
void dfs(string s1,int left,int right,int n)
{
if(left>n || right>n || right>left)//对不合法的括号对进行过滤
return ;
if(s1.size()==2*n)//边界的判断
{
s.push_back(s1);
return ;
}
dfs(s1+'(',left+1,right,n);//对左括号进行收缩
dfs(s1+')',left,right+1,n);//对右括号进行搜索
}
};
总结
这是一道对搜索考察的题目,本质上还是很好理解的,其实最需要注意的点其实是对不合法的括号组合的过滤,只要判别出了,那些不合法的情况,这道题就可以迎刃而解了!若有不足之处,跪求大佬的指正!