码迷,mamicode.com
首页 > 其他好文 > 详细

22. 括号生成

时间:2020-07-04 20:38:27      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:return   sch   cheng   情况   设计   多次   一个   oid   函数   

数字 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. 括号生成

标签:return   sch   cheng   情况   设计   多次   一个   oid   函数   

原文地址:https://www.cnblogs.com/boboboo610/p/13235889.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!