题目:
给出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 }