ps:题目来自力扣
括号生成
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
import java.util.ArrayList;
import java.util.List;
class Solution {
public List<String> generateParenthesis(int n) {
// 用于存储最终生成的有效括号组合的列表
List<String> result = new ArrayList<>();
// 调用回溯方法开始生成括号组合
backtrack(result, new StringBuilder(), 0, 0, n);
return result;
}
/**
* 回溯方法,用于递归生成有效的括号组合
* @param result 存储最终结果的列表
* @param current 当前正在构建的括号组合
* @param open 当前已使用的左括号数量
* @param close 当前已使用的右括号数量
* @param max 总共需要的括号对数
*/
private void backtrack(List<String> result, StringBuilder current, int open, int close, int max) {
// 当已使用的左括号和右括号数量都达到 max 时,说明已经生成了一个有效的括号组合
if (current.length() == max * 2) {
result.add(current.toString());
return;
}
// 如果左括号的使用数量小于 max,继续添加左括号
if (open < max) {
current.append("(");
// 递归调用,左括号使用数量加 1
backtrack(result, current, open + 1, close, max);
// 回溯操作,撤销上一步添加的左括号
current.deleteCharAt(current.length() - 1);
}
// 如果右括号的使用数量小于左括号的使用数量,继续添加右括号
if (close < open) {
current.append(")");
// 递归调用,右括号使用数量加 1
backtrack(result, current, open, close + 1, max);
// 回溯操作,撤销上一步添加的右括号
current.deleteCharAt(current.length() - 1);
}
}
}

代码解释
本题要求生成 n
对有效的括号组合。我们可以使用回溯算法来解决这个问题。回溯算法的核心思想是通过递归的方式尝试所有可能的组合,并在满足特定条件时进行回溯。
具体步骤
- 初始化结果列表 :
- 创建一个
ArrayList
类型的result
列表,用于存储最终生成的有效括号组合。
- 创建一个
- 调用回溯方法 :
- 调用
backtrack
方法开始生成括号组合,传入结果列表、一个空的StringBuilder
用于构建当前的括号组合、左括号使用数量初始值 0、右括号使用数量初始值 0 以及总共需要的括号对数max
。
- 调用
- 回溯方法
backtrack
:- 终止条件 :当
current
的长度等于max * 2
时,说明已经生成了一个有效的括号组合,将其添加到结果列表中并返回。 - 添加左括号 :如果左括号的使用数量小于
max
,将左括号添加到current
中,递归调用backtrack
方法,左括号使用数量加 1,然后进行回溯操作,撤销上一步添加的左括号。 - 添加右括号 :如果右括号的使用数量小于左括号的使用数量,将右括号添加到
current
中,递归调用backtrack
方法,右括号使用数量加 1,然后进行回溯操作,撤销上一步添加的右括号。
- 终止条件 :当
- 返回结果 :
- 当回溯过程结束后,返回存储所有有效括号组合的
result
列表。
- 当回溯过程结束后,返回存储所有有效括号组合的