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

LeetCode 第22题 括号生成

时间:2019-01-14 23:12:58      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:结果   amp   out   arch   gen   时间复杂度   int   不能   ring   

/*
给出 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题 括号生成

标签:结果   amp   out   arch   gen   时间复杂度   int   不能   ring   

原文地址:https://www.cnblogs.com/rainbow-/p/10269291.html

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