标签:
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