括号
括号。设计一种算法,打印n对括号的所有合法的(例如,开闭一一对应)组合。
说明:解集不能包含重复的子集。
- 画一棵2*n高的满二叉树,列出所有的组合
- 添加限制条件进行筛选,")" 不能大于"(" 数量,且分别不能大于n,满足左右括号数量相等且刚好为n时加入list中
- 每次分支遍历结束后要回溯
class Solution {
private List<String> ans;
public List<String> generateParenthesis(int n) {
ans = new ArrayList<>();
dfs(0, 0, n, new StringBuilder());
return ans;
}
private void dfs(int left, int right, int n, StringBuilder builder) {
if (left > n || right > n || right > left){
return;
}
if (left == right && left == n) {
ans.add(builder.toString());
}
dfs(left + 1, right, n, builder.append('('));
builder.deleteCharAt(builder.length() - 1);//回溯
dfs(left, right + 1, n, builder.append(')'));
builder.deleteCharAt(builder.length() - 1);//回溯
}
}