题目:括号生成
思路
1.分析问题:生成所有可能的并且有效的组合?问题是让我们罗列所有的可能性,很容易想到遍历搜索,那么常见的搜索方式有dfs和bfs。这里用dfs。
2.该怎么用dfs:平常都在树结构中使用dfs,可以将此题设置成数结构的环境
画个图
解释一下下面的灵魂图,根节点是“”,往左是左括号,往右是右括号
如何将题目场景与树结构匹配呢?除了节点内容,还需要有指向左子树和右子树的箭头,我们用int left和right来表示,left+1表示指向左子树,right+1表示指向右子树;
写dfs的步骤
a.边界条件:什么时候可以结束呢?当然是如下,左右括号的数量都要等于n,才能保证括号是有效的;
left==n&&right==n)
b.要排除无效的括号,也就是递归中的剪枝:left<right的时候是无效的
c.剩下正常的左右子树遍历;
代码
class Solution {
List<String> list=new ArrayList<>();
public List<String> generateParenthesis(int n) {
dfs("",0,0,n);
return list;
}
public void dfs(String str,int left,int right,int n){
if(left==n&&right==n){
list.add(str);
return;
}
if(left<right) return;
if(left<n) dfs(str+"(",left+1,right,n);
if(right<n) dfs(str+")",left,right+1,n);
}
}