LeetCode22 括号生成
描述
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
提示
1 <= n <= 8
代码
private List<String> res;
public List<String> generateParenthesis(int n) {
res = new ArrayList<>();
backtrack(n,0,0,new StringBuffer());
return res;
}
public void backtrack(int len,int left,int right,StringBuffer combination){
if (2*len==combination.length()){
res.add(combination.toString());
return;
}
if ((left+1)<=len){
combination.append('(');
backtrack(len,left+1,right,combination);
combination.deleteCharAt(combination.length()-1);
}
if (left>=right+1){
combination.append(')');
backtrack(len,left,right+1,combination);
combination.deleteCharAt(combination.length()-1);
}
}
总结
回溯+剪枝
每次添加只有两种情况,要么是 ‘(’ 要么是’)’
- 当前添加为’('时,需要检查长度时否超过n,如果超过n直接剪掉
- 当前添加为’)'时,需要检查加入后右括号的数量是否超过之前左括号的数量,如果超过直接剪掉