【LeetCode】22.括号生成
文章目录
题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
题解
熟悉分治算法的都知道,此题和全排列问题如出一辙,甚至更为简单一点,因为我们只需要考虑配对的情况
另外,既然是带搜素的全排列问题,就必须对搜素的解空间进行减枝
减枝条件:当左括号数或右括号数大于n或者右括号数比左括号数大时,停止搜索(无效的解,舍弃)
可以考虑在当列表中输入一个半括号后不停地迭代,直到左右半括号的数量相等,停止迭代,将结果存入结果列表中
搜索采用BFS
代码
class Solution {
public List<String> generateParenthesis(int n) {
List<String>res=new ArrayList<>();
generate(res,"",0,0,n);//初始值设为0
return res;
}
public void generate(List<String>res, String ans, int cnt1,int cnt2, int n){
if(cnt1>n||cnt2>n||cnt2>cnt1) return;
if(cnt1==n||cnt2==n) res.add(ans);
//数量相等,即可以配对,答案存入列表
if(cnt1>=cnt2){//减枝
String str1=new String(ans);
//在前一个的基础上进行BFS搜索
generate(res, ans+"(", cnt1+1, cnt2, n);
generate(res, str1+")", cnt1, cnt2+1, n);
}
}
}
总结
这题是在栈的经典应用——括号匹配的基础上进行拓展为搜索+减枝
关键还是在于如何进行减枝以提高搜索的效率