Leetcode-22. 括号生成
难度中等2135
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
有效括号组合需满足:左括号必须以正确的顺序闭合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:
输入:n = 1
输出:["()"]提示:
1 <= n <= 8
思路
运用二叉树dfs加剪枝算法

首先运用二叉树将所有情况排列出来,我们发现有很多是不符合要求的,我们现在运用剪枝算法将不符合要求的剪掉。
`public List<String> generateParenthesis(int n) {`
`List<String> res = new ArrayList<>();`
`if (n <= 0) return res;`
`dfs(n, "", res);`
`return res;`
`}`
`private void dfs(int n, String path, List<String> res) {`
`if (path.length() == 2 * n) {`
`res.add(path);`
`return;`
`}`
```java
dfs(n, path + "(", res);
dfs(n, path + ")", res);
```
`}`
剪枝算法
我们首先定义左括号的个数为op,右括号的个数为cl,首先op的个数不能大于n,又因为括号是闭合的,所以在排列的过程中右括号的个数要小于左括号的个数,除此之外,排列不能用右括号开始。

void dfs(int n, String path, List<String> res, int open, int close) {
if (open > n || close > open) return;
```java
if (path.length() == 2 * n) {
res.add(path);
return;
}
dfs(n, path + "(", res, open + 1, close);
dfs(n, path + ")", res, open, close + 1);
```
}
代码:
`class Solution {`
`public List<String> generateParenthesis(int n) {`
`List<String> res =new ArrayList<>();`
`if(n<=0) return res;`
`dfs(n,"",res,0,0);`
`return res;`
`}`
`private void dfs(int n,String path,List<String> res,int open,int close){`
`if(open>n||close>open) return;`
`if(path.length()==2*n){`
`res.add(path);`
`return;`
`}`
`dfs(n,path+"(",res,open+1,close);`
`dfs(n,path+")",res,open,close+1);`
`}`
`}`


华纳圣淘沙开户步骤详解(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户流程全解析(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司账户注册指南(183-8890-9465—?薇-STS5099【6011643】
新手如何开通华纳圣淘沙公司账户(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙企业开户标准流程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户:从零到一(183-8890-9465—?薇-STS5099【6011643】
官方指南:华纳圣淘沙公司开户流程(183-8890-9465—?薇-STS5099【6011643】
华纳圣淘沙公司开户流程说明书(183-8890-9465—?薇-STS5099【6011643】
《怨屋本铺(未删减版)》日本剧高清在线免费观看:https://www.jgz518.com/xingkong/156299.html