题目来源:https://leetcode-cn.com/problems/generate-parentheses/
大致题意:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合
思路
dfs + 回溯,遍历所有可能的组合
dfs + 回溯
具体看代码
class Solution {
List<String> ans;
int n;
public List<String> generateParenthesis(int n) {
ans = new ArrayList<>();
this.n = n;
dfs(0, 0, 0, new StringBuffer());
return ans;
}
// idx 表示当前遍历的索引
// leftCount 表示当前序列中还未匹配的左括号数目
// leftCount 表示当前序列中已经有的左括号数目
// sb 为当前的序列
public void dfs(int idx, int leftCount, int leftSum, StringBuffer sb) {
// 索引为 0 时,只能添加左括号
if (idx == 0) {
dfs(idx + 1, 1, 1, sb.append('('));
// 回溯
sb.deleteCharAt(idx);
return;
}
// 索引为 n * 2 - 1 时,即最后一个时,添加到答案集合中
if (idx == n * 2 - 1) {
// 最后只能添加右括号
sb.append(')');
ans.add(sb.toString());
// 回溯
sb.deleteCharAt(idx);
return;
}
// 有未匹配左括号时才能加右括号
if (leftCount >= 1) {
dfs(idx + 1, leftCount - 1, leftSum, sb.append(')'));
// 回溯
sb.deleteCharAt(idx);
}
// 保证添加的左括号不超过 n
if (leftSum < n) {
dfs(idx + 1, leftCount + 1, leftSum + 1, sb.append('('));
// 回溯
sb.deleteCharAt(idx);
}
}
}