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

生成括号

时间:2015-12-04 20:33:04      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

生成括号

给定 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

 

生成括号

标签:

原文地址:http://www.cnblogs.com/FJH1994/p/5020184.html

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