LeetCode--括号生成

题目:

  给出n代表生成括号的对数,请写出一个函数,使其能够生成所有可能的并且有效的括号组合;

 

  官方给出解答是使用回溯法,穷举所有可能的括号组合,并在穷举的过程中判断每一个组合的有效性,这道题判断括号组合有效性的特殊性在于,这个括号组合只包含一种类型的括号,如 '(' 和 ')' ,所以可以通过计算左括号和右括号的个数是否相等来判断有效性:

 1 import java.util.*;
 2 
 3 public class Solution {
 4     public List<String> generateParenthesis(int n) {
 5         List<String> result = new ArrayList<>();
 6         if(n > 0)
 7         {
 8             generateAll(new char[2 * n], 0, result);
 9         }
10         return result;
11     }
12     
13     public void generateAll(char[] symbol, int pos, List<String> result)
14     {
15         if(pos == symbol.length)             // 对每一种括号组合判断有效性
16         {
17             if(isValid(symbol))
18             {
19                 result.add(new String(symbol));
20             }
21         }
22         else
23         {                              // 穷举所有可能的括号组合
24             symbol[pos] = '(';
25             generateAll(symbol, pos+1, result);
26             symbol[pos] = ')';
27             generateAll(symbol, pos+1, result);
28         }
29     }
30     
31     public boolean isValid(char[] symbol)
32     {
33         int count = 0;
34         for(int i = 0; i < symbol.length; i++){     // 对于同一类型的括号而言,判断有效性可通过判断左括号和右括号的数量是否相等
35             if(symbol[i] == '(')
36             {
37                 count++;
38             }
39             else
40             {
41                 count--;
42             }
43             if(count < 0) return false;        // 需要注意的是,在判断过程中,右括号的数量必须小于或等于左括号的数量
44         }
45         return count == 0;        // 左右括号个数相等时,返回true
46     }
47 }

 

posted @ 2019-10-23 14:29  Latuper  阅读(364)  评论(0编辑  收藏  举报