22. 括号生成

Posted boboboo610

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了22. 括号生成相关的知识,希望对你有一定的参考价值。

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例:

输入:n = 3
输出:[
       "((()))",
       "(()())",
       "(())()",
       "()(())",
       "()()()"
     ]


法一:

 1     public List<String> generateParenthesis(int n) {
 2         ArrayList<String> ans = new ArrayList<>();
 3         char[] chars = new char[2*n];
 4         int pos = 0;
 5         scheng(chars,pos,ans);
 6         return ans;
 7     }
 8     //递归生成所有组合情况
 9     public void scheng(char[] chars,int pos,ArrayList<String> ans){
10         if(pos == chars.length){
11             if(xing(chars))
12                 ans.add(new String(chars));
13         }else {
14             chars[pos] = ‘(‘;
15             scheng(chars,pos+1,ans);
16             chars[pos] = ‘)‘;
17             scheng(chars,pos+1,ans);
18         }
19     }
20     //验证是否符合条件
21     public boolean xing(char[] chars){
22         int balance = 0;
23         for (char c : chars) {
24             if(c == ‘(‘)
25                 balance++;
26             else
27                 balance--;
28             if(balance<0)//一旦出现单“)” 则必然不匹配
29                 return false;
30         }
31         return balance == 0;
32     }
暴力枚举所有组合 再判断是否符合条件

法二:

 1     public List<String> generateParenthesis(int n) {
 2         ArrayList<String> ans = new ArrayList<>();
 3         String cur = "";
 4         scheng(cur,0,0,n,ans);
 5         return ans;
 6     }
 7     public void scheng(String cur,int kai,int bi,int max,ArrayList<String> ans){
 8         if(cur.length() == 2*max){
 9             ans.add(cur);
10             return;
11         }
12 
13         if(kai < max)//保证左括号满足对数要求
14             scheng(cur+"(",kai+1,bi,max,ans);
15         if(bi < kai)//保证右括号和左括号对应
16             scheng(cur+")",kai,bi+1,max,ans);
17 
18     }

回溯法,只考虑“( ”个数,因为先运行左括号,所以不会出现右括号多余情况。

每有一个(,则必有一个)对应,则多次递归,直至字符串长度等于2n。相比较法一,少计算不符合条件的组合。

 

以上是关于22. 括号生成的主要内容,如果未能解决你的问题,请参考以下文章

22. 括号生成

22. 括号生成

LeetCode 22. 括号生成c++/java详细题解

Leetcode22. 括号生成(简单回溯)

Leecode22. 括号生成——Leecode大厂热题100道系列

Leecode22. 括号生成——Leecode大厂热题100道系列