22. 括號生成
阿新 • • 發佈:2020-07-04
數字 n 代表生成括號的對數,請你設計一個函式,用於能夠生成所有可能的並且 有效的 括號組合。
示例:
輸入:n = 3
輸出:[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
法一:
1 public List<String> generateParenthesis(int n) { 2 ArrayList<String> ans = new ArrayList<>(); 3 char[] chars = new char[2*n]; 4 intpos = 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。相比較法一,少計算不符合條件的組合。