题目
数字 n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入: n = 3
输出: ["((()))","(()())","(())()","()(())","()()()"]
题解
方式一:回溯
一开始我用回溯找出所有组合,但是需要去重、过滤非法数据,超时了...
这种写法很难理解为什么括号是合法的,画图多debug几次
public static List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<>();
dfs(result, "", 0, 0, n);
return result;
}
private static void dfs(List<String> result, String current, int open, int close, int max) {
// 递归终止条件:当左括号和右括号的数量都达到 max 时,将当前组合加入结果列表
if (current.length() == max * 2) {
result.add(current);
return;
}
// 如果左括号的数量小于 max,可以添加左括号
if (open < max) {
dfs(result, current + "(", open + 1, close, max);
}
// 如果return回来在这里就继续在当前栈执行
// 如果右括号的数量小于左括号的数量,可以添加右括号
if (close < open) {
dfs(result, current + ")", open, close + 1, max);
}
// 如果return回来在这里就返回上一个栈
}
总结
算法:回溯