码迷,mamicode.com
首页 > 编程语言 > 详细

实现一种算法,打印n对括号的全部有效组合(即左右括号正确配对)

时间:2015-08-29 23:23:46      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

  
public static Set<String> generateParens(int remaining)
{
Set<String> set=new HashSet<String>();
if(remaining == 0)
set.add("");
else
{
Set<String> prev=generateParens(remaining-1);
    
    for(String str:prev)
    {
    for(int i=0;i<str.length();i++)
    {
    if(str.charAt(i)==‘(‘)
    {
    String s=insertInside(str,i);
    /*
             若s不在set中,则将s插入set中。注意,
             插入元素之前,HashSet会自动检查有无重复
         因此没必要专门检查元素是否重复
     */
    set.add(s);
    }
    }
    if(!set.contains("()"+str))
    {
    set.add("()"+str);
    }
   }
 }
return set;
}
public String insertInside(String str,int leftIndex)
{
String left=str.substring(0,leftIndex+1);
String right=str.substring(leftIndex+1,str.length());
return left+"()"+right;
}

技术分享

public void addParen(ArrayList<String> list,int leftRem,int rightRem,char[] str,int count)
{
if(leftRem<0|| rightRem<leftRem) return; //无效状态
if(leftRem==0 && rightRem == 0)//没有括号可用了
{
   String s=String.copyValueOf(str);
   list.add(s);
}
else
{
/*
若还有左括号可用,则加入一个左括号
*/
if(leftRem>0)
{
str[count]=‘(‘;
addParen(list,leftRem-1,rightRem,str,count+1);
}
/*
若字符串是无效的,则加入右括号
*/
if(rightRem>leftRem)
{
str[count]=‘)‘;
addParen(list,leftRem,rightRem-1,str,count+1);
}
/*
若字符串是有效的,则加入右括号
*/
if(rightRem>leftRem)
{
str[count]=‘)‘;
addParen(list,leftRem,rightRem-1,str,count+1);
}
}
}
public ArrayList<String> generateParens(int count)
{
char [] str=new char[count*2];
ArrayList<String> list=new ArrayList<String>();
addParen(list,count,count,str,0);
return list;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

实现一种算法,打印n对括号的全部有效组合(即左右括号正确配对)

标签:

原文地址:http://blog.csdn.net/wangfengfan1/article/details/48091921

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