前言
提示:以下是本篇文章正文内容,编程语言为Java
一、题目描述
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
链接:括号生成
二、解题思路
本题可以使用 DFS 来解决。我们以 n = 2
为例,画括号生成的树形结构图。
画图以后,可以得出的结论:
-
当前左右括号都有大于 0 个可以使用的时候,才产生分支;
-
产生左分支的时候,只看当前是否还有左括号可以使用;
-
产生右分支的时候,还受到左分支的限制,右边剩余可以使用的括号数量一定得在严格大于左边剩余的数量的时候,才可以产生分支;
-
在左边和右边剩余的括号数都等于 0 的时候结算。
参考:括号生成
三、示例代码
class Solution {
List<String> ans=new ArrayList<>();
public List<String> generateParenthesis(int n) {
dfs("",n,n);
return ans;
}
public void dfs(String cur, int left, int right) {
//括号都用完了,可以结算了
if(left==0 && right==0){
ans.add(cur);
return;
}
//此时括号是无效的
if(left>right){
return;
}
//生成左括号
if(left>0){
dfs(cur+"(",left-1,right);
}
//生成右括号
if(right>0){
dfs(cur+")",left,right-1);
}
}
}