题目:
括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
例如,给出 n = 3,生成结果为:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
分析:
dfs搜索,如果当前左括号用超了,右括号用超了,或者右括号的数量大于左括号的数量直接返回。
而如果左右括号刚好用尽,代表生成一个结果,记录下来。
然后就是递归,添加左括号,右括号。
程序:
class Solution { public List<String> generateParenthesis(int n) { res = new ArrayList<>(); StringBuilder str = new StringBuilder(); generateParenthesis(0, 0, n, str); return res; } private void generateParenthesis(int l, int r, int n, StringBuilder str){ if(r > n || l > n || r > l) return; if(r == n && l == n){ res.add(str.toString()); return; } generateParenthesis(l+1, r, n, new StringBuilder(str).append("(")); generateParenthesis(l, r+1, n, new StringBuilder(str).append(")")); } private List<String> res; }