回溯法
参考代码随想录的回溯模板思路
void backtracking(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
处理节点;
backtracking(路径,选择列表); // 递归
回溯,撤销处理结果
}
}
注意加入右括号时应有条件限制
class Solution {
List<String> ans;
public List<String> generateParenthesis(int n) {
ans = new ArrayList<>();
dfs(0, 0, n, new StringBuffer());
return ans;
}
private void dfs(int nowL, int nowR, int n, StringBuffer isb) {
if (nowL == n && nowL == nowR) {
ans.add(isb.toString());
} else {
StringBuffer sb = new StringBuffer(isb);
if (nowL < n) {
sb.append("(");
dfs(nowL + 1, nowR, n, sb);
sb.deleteCharAt(sb.length() - 1);
}
if (nowR < nowL) {
sb.append(")");
dfs(nowL, nowR + 1, n, sb);
sb.deleteCharAt(sb.length() - 1);
}
}
}
}
注意:StringBuffer
的用法
- 添加元素
append
- 删除元素
deleteCharAt(sb.length() - 1)
- 为了不影响原
StringBuffer
的值,在操作时可以进行拷贝