一、题目描述
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
二、解题思路
思路:问题抽象成树形问题
假设n=2,那么就生成两对括号,对应的有效括号的输出应该如下:
那么包含有无效括号对的所有可能枚举如下:
抽象成树形结构:
使用深度优先搜索把所有的括号组合遍历出来,那么怎么从这些组合中得到有效的括号组合呢?下面就要用到剪枝策略。首先要知道有效括号中的开闭括号都是两个,open=2,close=2,那么每条路径都要判断一下:
看到图中的第一条路径,不符合条件(当open或者close一旦大于n),减掉:
继续判断下一条路径:
不符合条件,再减:
以此为例,继续剪枝,最终得到如下的结果:
三、代码演示
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
//如果n小于等于0返回空的结果集
if(n<=0){
return res;
}
dfs(n, "",res,0,0);
return res;
}
//path指路径,res是存放的结果集
private void dfs(int n, String path, List<String>res, int open, int close){
if(open>n || close>open){
return;
}
//当结果集等于路径长度的时候,将路径添加到res中
if(path.length()==2*n){
res.add(path);
return;
}
//不同的递归传参,先选择开括号,再选择闭括号
dfs(n, path + "(", res,open+1, close);
dfs(n, path + ")", res,open,close+1);
}
}