题目
https://leetcode-cn.com/problems/generate-parentheses/
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
思路
(1)一开始想的是生成1个的,然后生成2个的,()
插进去一个的,以此递推,想了下重复性判断有点困难,放弃。
(2)想了下DP,感觉不像DP类题目。
(3)想了下规律,加入n为2
(
-> 可左可右
((
->可右可右
()
->可左可右
...
干脆直接递归调用,试一下,测试代码打了个100超时,手抖点了提交竟然通过了。
i为左括号可用数量,right为右括号可用数量
f(i-1,j),i>0
f(i,j) =
f(i,j-1),j>0且i<j
代码
import java.util.ArrayList;
import java.util.List;
public class Solution_22 {
public static void main(String[] args) {
generateParenthesis(5);
}
public static List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
core(list, "", n, n);
return list;
}
public static void core(List<String> list, String current, int left, int right) {
// 递归出口
if (left == 0 && right == 0) {
list.add(current);
return;
}
// 优先左,第一个必须是"("
if (left > 0) {
core(list, current + "(", left - 1, right);
}
// 要合法,left必须小于right
if (right > 0 && left < right) {
core(list, current + ")", left, right - 1);
}
}
}