详情链接:22. 括号生成
1.问题思路
这里先弄清有效括号有什么特点。
① 左括号永远在左边。
② 左括号的数量等于右括号。
这里我们可以记录左括号数量=右括号数量=targetNum,进行dfs遍历,每次对括号进行-1操作。
① 终止条件,right括号数<左括号数, 代表已使用的右括号数量比左括号数量多当前已经是无效结果了 需要退出。还有一种就是左右括号已经用完了。
② 每层的广度优先都是2,要么是左括号,要么就是右括号。
2.代码实现
class Solution {
List<String> result = new ArrayList<String>();
StringBuilder sb = new StringBuilder();
public List<String> generateParenthesis(int n) {
// 特判
if (n == 0) {
return result;
}
dfs(0, 0, n);
return result;
}
public void dfs(int leftNum, int rightNum, int n) {
// 终止条件
if(leftNum == n && rightNum == n) {
result.add(sb.toString());
return;
}
// 剪枝条, 剩下的左括号应该要大于右括号。如果小于则不何可
// 要保证以左括号开始,右括号结束
if (leftNum < rightNum) {
return;
}
// 左括号还存在,进行下层递归
if (leftNum < n) {
sb.append('(');
dfs(leftNum+1, rightNum, n);
// 回溯
sb.deleteCharAt(sb.length()-1); // 递归后需进行回溯
}
// 右括号还存在,进行下层递归
if (rightNum < n) {
sb.append(')');
dfs(leftNum, rightNum+1, n);
sb.deleteCharAt(sb.length()-1); // 递归后需进行回溯
}
}
}
本文介绍了一种使用深度优先搜索(DFS)解决有效括号生成问题的方法,通过记录左括号和右括号数量,确保生成的括号串中左括号数量始终等于右括号数量。代码实现了从0到n个括号的生成,包括终止条件和递归过程的剪枝优化。
616

被折叠的 条评论
为什么被折叠?



