生成括号
生成括号
给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果。
样例
View Code
给定 n = 3
, 可生成的组合如下:
"((()))", "(()())", "(())()", "()(())", "()()()"
嗯。。想了半天。
其实可以当作一个先序遍历二叉树的问题。
根节点是'(',左孩子都是'(',右孩子都是')',然后递归先序遍历。i,j分别是'(',')'剩余的数量,如果序列合法,则必然i<=j。p是遍历方向,
0向左,1向右。若i>0则允许向左,i<j && j>0则允许向右。感觉代码写的有些乱。
1 public class Solution { 2 /** 3 * @param n n pairs 4 * @return All combinations of well-formed parentheses 5 */ 6 public ArrayList<String> generateParenthesis(int n) { 7 ArrayList<String> ss = new ArrayList<String>(); 8 ss = print(n,n,ss,0); 9 return ss; 10 } 11 12 ArrayList<String> print(int i,int j,ArrayList<String> ss,int p){ 13 if(ss.size() == 0) { 14 String s = "("; 15 ss.add(s); 16 i--; 17 }else { 18 ArrayList<String> list = new ArrayList(); 19 if(p == 0) { 20 for(String s:ss){ 21 String s1 =s + "("; 22 list.add(s1); 23 } 24 i--; 25 }else { 26 for(String s:ss){ 27 String s1 =s + ")"; 28 list.add(s1); 29 } 30 j--; 31 } 32 ss = list; 33 } 34 35 ArrayList<String> list = new ArrayList(); 36 if(i > 0) { 37 list.addAll(print(i,j,ss,0)); 38 } 39 if(i < j && j > 0) { 40 list.addAll(print(i,j,ss,1)); 41 } 42 if(list.size() == 0)return ss; 43 return list; 44 } 45 }