数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
- import java.util.ArrayList;
- import java.util.List;
-
- class Solution {
- public List
generateParenthesis(int n) { - List
result = new ArrayList<>(); - backtrack(result, new StringBuilder(), 0, 0, n);
- return result;
- }
-
- private void backtrack(List
result, StringBuilder current, int open, int close, int max) { - // 如果当前字符串的长度等于2 * n,说明已经生成了一个有效的组合
- if (current.length() == 2 * max) {
- result.add(current.toString());
- return;
- }
-
- // 添加一个左括号
- if (open < max) {
- current.append('(');
- backtrack(result, current, open + 1, close, max);
- current.deleteCharAt(current.length() - 1); // 回溯,移除最后一个字符
- }
-
- // 添加一个右括号
- if (close < open) {
- current.append(')');
- backtrack(result, current, open, close + 1, max);
- current.deleteCharAt(current.length() - 1); // 回溯,移除最后一个字符
- }
- }
- }
backtrack 会为每一对括号进行两次递归调用:一次是添加左括号,一次是添加右括号。result 存储所有有效的括号组合,其数量最多为 C(2n, n) / 2,这大约是 4^n / 2。1. 递归(Recursion):
backtrack 方法递归地构建所有可能的括号组合。2. 回溯(Backtracking):
3. 字符串构建(String Building):
StringBuilder 类来构建和修改字符串。StringBuilder 是一个可变的字符串序列,它比 String 类型更高效,尤其是在需要多次修改字符串时。4. 条件语句(Conditional Statements):
if 语句来控制逻辑流程,决定何时添加左括号或右括号。5. 列表操作(List Operations):
ArrayList 来存储和返回结果。ArrayList 是一个动态数组,可以方便地添加、删除和访问元素。6. 字符串操作(String Operations):
toString() 方法将 StringBuilder 对象转换为字符串。deleteCharAt(int index) 方法从 StringBuilder 中删除指定位置的字符。7. 算法逻辑(Algorithm Logic):
8. 边界条件处理(Boundary Conditions):
current 的长度达到 2 * max 时,表示已经生成了一个有效的括号组合,这时将当前字符串添加到结果列表中。以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。