题目描述
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解法一:回溯法(深度优先)
代码一:做加法
class Solution {
List<String> list=new LinkedList();
public List<String> generateParenthesis(int n) {
backtracking("",0,0,n);
return list;
}
public void backtracking(String cur,int open,int close,int max){
//当字符串大小为2*n,则加入列表
if(cur.length()==max*2){
list.add(cur);
return;
}
//计算开括号数目,用max限制
if(open<max){
backtracking(cur+"(",open+1,close,max);
}
//闭括号数不能超过开括号
if(close<open){
backtracking(cur+")",open,close+1,max);
}
}
}
代码二:做减法
- 也可将int open,int close,int max 替换成 int left,int right
- 赋值:left=n right=n
- 条件:left>0 right>0 left<right
解法二:闭合法(动态规划)
- “(”+left")"+right
- left 从c=0->n-1对括号
- right 从 c=n-1->0对括号
- 过程:
- right “” left “” ans “()”
- right “()” left “” ans"()()"
- right “” left “()” ans"(())"
- right “()()” left"" ans"()()()" 1
- right “” left “()()” ans"((()))" 2
- right “” left “” ans “()”
- right “” left “()” ans"(())"
- right “()” left"()" ans"(())()" 3
- right"(())" left"" ans"()(())" 4
- right"" left"(())" ans"((()))" 5
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans=new LinkedList();
if(n==0){
ans.add("");
}
for(int c=0;c<n;c++){
//c个括号
for(String left:generateParenthesis(c)){
//n-1-c个括号
for(String right:generateParenthesis(n-1-c)){
ans.add("("+left+")"+right);
}
}
}
return ans;
}
}