1. 程式人生 > 實用技巧 >22. 括號生成

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。相比較法一,少計算不符合條件的組合。