LeetCode 第22題 括號生成
阿新 • • 發佈:2019-01-15
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, intlevel, 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題 括號生成