生成括号

生成括号

给定 n 对括号,请写一个函数以将其生成新的括号组合,并返回所有组合结果。

样例

给定 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 }
View Code

 

posted @ 2015-12-04 18:32  -.-|  阅读(532)  评论(0编辑  收藏  举报