22. 括号生成 - 力扣(LeetCode)]
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入: n = 3
输出: ["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入: n = 1
输出: ["()"]
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<String>();
backtrack(ans, new StringBuilder(), 0, 0, n);
return ans;
}
public void backtrack(List<String> ans, StringBuilder cur, int open, int close, int max) {
if (cur.length() == max * 2) {
// 若cur的长度已达到2max,则已经是满足要求的一条答案,加入ans
ans.add(cur.toString());
return;
}
if (open < max) {
// 统计正反括号的数量,若少于max,说明可继续添加
cur.append('(');
backtrack(ans, cur, open + 1, close, max);
cur.deleteCharAt(cur.length() - 1);
// 回溯,删去最后一个符号,探索其他的后续搭配
}
// 反括号需满足数量不超过正括号的数量,由于正括号的判断只和max有关,且先于反括号的判断,所以不存在前缀中反括号的数量更多的情况
if (close < open) {
cur.append(')');
backtrack(ans, cur, open, close + 1, max);
cur.deleteCharAt(cur.length() - 1);
}
}
}
// 回溯法
// 先添加正括号,递归正括号中能添加就添加