22. 括号生成
看到题目,我们就立即可知,这是一个递归搜索的问题。
但关于同一种思路的建模,有两种:
- 递归中,保证右括号总是小于等于左括号,于是返回条件就是右括号数量等于n
- 递归中,不控制左右括号关系,但是过程中会进行判断(右括号数目大于左括号时)剪枝,于是返回条件就是左括号和右括号同时等于n
下面给出两种实现代码:
第一种:
private List<String> ans = new ArrayList<>();
public List<String> generateParenthesis(int n) {
dfs(0, 0, n, new StringBuilder());
return ans;
}
private void dfs(int le, int ri, int n, StringBuilder builder) {
if (ri == n) {
ans.add(builder.toString());
return;
}
if (le < n) {
StringBuilder bu = new StringBuilder(builder);
bu.append('(');
dfs(le + 1, ri, n, bu);
}
if (le > ri) {
StringBuilder bu = new StringBuilder(builder);
bu.append(')');
dfs(le, ri + 1, n, bu);
}
}
第二种:
private List<String> ans = new ArrayList<>();
public List<String> generateParenthesis(int n) {
dfs(0, 0, n, new StringBuilder());
return ans;
}
private void dfs(int le, int ri, int n, StringBuilder builder) {
if (ri == n && le == n) {
ans.add(builder.toString());
return;
}
if (le > n || ri > n || ri > le) return;
StringBuilder bu = new StringBuilder(builder);
bu.append('(');
dfs(le + 1, ri, n, bu);
StringBuilder xu = new StringBuilder(builder);
xu.append(')');
dfs(le, ri + 1, n, xu);
}