一、需求
- 数字
n
代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3 输出:["((()))","(()())","(())()","()(())","()()()"]
提示:
1 <= n <= 8
二、DFS
2.1 思路分析
- 给定一个正整数n,n表示括号的对数,假设n=2,那么可能的有效括号为:()()、(()),那就要想办法怎么根据这个n得到这两种组合?
- 通过画图得到两对括号可能的组合,如下图所示:
3.现在要想办法,将这个图转换成思路,最后得到合法的括号,那么这张图包含了哪些信息呢?参考大佬的分析过程:https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/
①什么时候会同时产生左右分支?左括号和右括号的个数都大于零的时候(思路①等价于思路②+思路③);
②产生左分支的条件是什么?只要有左括号就可以产生;
③产生右分支的条件是什么?存在右括号就可以产生;
④什么时候剪枝?左括号的数量大于左括号的数量时;
⑤当左括号数量与右括号数量均为零时,将合法的括号加入到list中;
4.现在有了思路,就要想办法转换成代码
2.2 代码实现
class Solution {
List<String> res = new ArrayList<>();
public List<String> generateParenthesis(int n) {
if(n == 0) {
return res;
}
dfs("", n, n);
return res;
}
/**
*该方法将合法的括号加入到List中
*@param str 拼接括号的字符串变量
*@param left 左括号的数量
*@param right 右括号的数量
*/
public void dfs(String str, int left, int right) {
//思路⑤
if(left == 0 && right == 0) {
res.add(str);
return;
}
//思路④
if(left > right) {
return;
}
//思路②
if(left > 0) {
dfs(str + "(", left - 1, right);
}
//思路①
if(right > 0) {
dfs(str + ")", left, right - 1);
}
}
}
2.3 复杂度分析
- 时间复杂度为;
- 空间复杂度为O(n),最多递归2n层;
三、学习地址
作者:liweiwei1419
链接:https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/