文章目录
题目
方法一:递归:
-
递归入口 空子结果集,左括号数目(初始为0),右括号数目(初始为0)
-
递归出口
若左括号 大于n 或者 左括号数量大于右括号数量 不符合题目要求 结束递归剪枝
若 左括号数目 和 右括号数目都等于n 说明符合条件 结束递归
-
递归方向
dfsback(zre+'(',leftsum+1,rightsum);//左括号递归
dfsback(zre+')',leftsum,rightsum+1);//右括号递归
java
class Solution {
List<String> res = new ArrayList<>(); // 结果集
int n = 0;
public List<String> generateParenthesis(int n) {
this.n = n;
String zre = "";//子结果集
dfsback(zre,0,0);
return res;
}
public void dfsback(String zre,int leftsum,int rightsum){// n=3
// leftsum > n(((( 不满足 leftsum < rightsum (( )))不满足
if(leftsum > n || leftsum < rightsum ) return;
//若左括号 大于n 或者 左括号数量大于右括号数量 不符合题目要求 结束递归剪枝
if(leftsum == n && rightsum == n ){
//若 左括号数目 和 右括号数目都等于n 说明符合条件 结束递归
res.add(zre);
return;
}
dfsback(zre+'(',leftsum+1,rightsum);//左括号递归
dfsback(zre+')',leftsum,rightsum+1);//右括号递归
}
}
或者下面在递归过程中根据条件去递归,符合括号生成条件才递归
java
// 全递归 根据括号数目在递归过程中剪枝
List<String> res = new ArrayList<>(); // 结果集
int n = 0;
public List<String> generateParenthesis(int n) {
this.n = n;
String zre = "";//子结果集
dfsback(zre,0,0);
return res;
}
public void dfsback(String zre,int leftsum,int rightsum){
if(leftsum == n && rightsum == n) { //左右括号都达到了n 结束递归
res.add(zre);
return;
}
if(leftsum > n || leftsum < rightsum ) return;//若左括号 大于n 或者 左括号数量大于右括号数量 不符合题目要求 结束递归剪枝
if(leftsum == rightsum) dfsback(zre+'(',leftsum+1,rightsum); //在左括号右括号相等的情况下 只能添加左括号
if(leftsum > rightsum) {//在左括号大于右括号的情况下 两种括号都能添加
dfsback(zre+'(',leftsum+1,rightsum);//左括号递归
dfsback(zre+')',leftsum,rightsum+1);//右括号递归
}
}
参考视频:括号生成
方法二:递归+回溯
java
// 递归+回溯
List<String> res = new ArrayList<>(); // 结果集
int n = 0;
public List<String> generateParenthesis(int n) {
StringBuffer str = new StringBuffer();
this.n = n;
// String zre = "";//子结果集
dfsback(str,0,0);
return res;
}
public void dfsback(StringBuffer zre,int leftsum,int rightsum){
if(leftsum == n && rightsum == n) { //左右括号都达到了n 结束递归
res.add(zre.toString());
return;
}
if(leftsum > n || leftsum < rightsum ) return;//若左括号 大于n 或者 左括号数量大于右括号数量 不符合题目要求 结束递归剪枝
zre.append('(');
dfsback(zre,leftsum+1,rightsum);//左括号递归
zre.deleteCharAt(zre.length()-1);//回溯
zre.append(')');
dfsback(zre,leftsum,rightsum+1);//右括号递归
zre.deleteCharAt(zre.length()-1);//回溯
}