1. 程式人生 > >LeetCode 第22題 括號生成

LeetCode 第22題 括號生成

sea 當前 div == 組合 不能 val pop n)

/*
給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 n = 3,生成結果為:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]
 */


/*
思路:回溯剪枝 時間復雜度為O(n2^n) 如果剪枝嚴格到一定程度,可不需要調用isMatch()驗證,時間復雜度降為O(2^n).
當限制趨於嚴格,leetCode擊敗對手從5%變為97%
剪枝函數 1.左括號數不能超過總括號數一半
2.當前右括號數不能多於左括號數
3.最後一個位置不能填左括號,第一個位置不能填右括號.

*/
 4
 1 class Solution23 {
 2 
 3   public List<String> generateParenthesis(int n) {
 4     char[] solveArray = new char[2 * n];
 5     List<String> list = new ArrayList<>();
 6     search(2 * n, 0, solveArray, list, 0, 0);
 7     return list;
 8   }
 9 
10   private void search(int n, int
level, char[] solveArray, List<String> list, int left, int right) { 11 12 if (level == n) { 13 //if (isMatch(solveArray)) { //當限制趨於嚴格,不必再花費O(n)的時間檢查括號匹配是否正確 14 list.add(String.valueOf(solveArray)); 15 // } 16 } else { 17 if (right < left) { 18 solveArray[level] = ‘)‘;
19 search(n, level + 1, solveArray, list, left, right + 1); 20 } 21 if (left < n / 2 && level != n - 1) { 22 solveArray[level] = ‘(‘; 23 search(n, level + 1, solveArray, list, left + 1, right); 24 } 25 } 26 } 27 28 private boolean isMatch(char[] solveArray) { 29 System.out.println(solveArray); 30 Stack<Character> stack = new Stack<>(); 31 for (char c : solveArray) { 32 if (c == ‘(‘) { 33 stack.push(‘(‘); 34 } else { 35 if (stack.isEmpty()) { 36 return false; 37 } 38 stack.pop(); 39 } 40 } 41 return stack.isEmpty(); 42 } 43 }





LeetCode 第22題 括號生成