看到别人写的代码,感觉有些繁琐,自己写了个简单的。
主要用到了Collections中的shuffle,洗牌模式。供大家参考
需求:编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符
例如:
原始字符串是"abc",打印得到下列所有组合情况
"a" "b" "c"
"ab" "bc" "ca" "ba" "cb" "ac"
"abc" "acb" "bac" "bca" "cab" "cba"
public class Test24 {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<String> ts = new TreeSet<String>();
printAll("abc",ts);
System.out.println(ts+"..."+ts.size());
}
public static void printAll(String name,TreeSet<String> ts)//没有直接打印,放进了集合中,排序了
{
if(name.length()==1)
ts.add(name);
else
{
ArrayList<String> al = new ArrayList<String>();
ArrayList<String> a2= new ArrayList<String>();
StringBuilder sb = new StringBuilder();
for(int x=0;x<name.length();x++)
{
al.add(name.charAt(x)+"");//先存入集合中,洗牌
}
while(true)//一直不停洗牌
{
sb.delete(0,sb.length());
Collections.shuffle(al);
for(String str:al)
{
sb.append(str);
}
String s = sb.toString();
if(!a2.contains(s))//直到新集合不包含,再存,
a2.add(s);
if(a2.size()==countNum(name.length()))//等存到数量就不再洗牌,数量=3!(abc),=4!(abcd),另外定了个方法
break;
}//上面部分主要是打印一个字符串,长度不变 例如“abc”所有组合
//观察的:abc——ab acb——ac,bca——bc等等,长度减少就是取字符串前面的部分(不带最后一个脚标)
//下面主要的到 ab ac bc,每个串的组合,每个都去递归就可以了
for(int x=0;x<a2.size();x++)
{
String s = a2.get(x);
ts.add(s);//a2集合已经为所得,只是再存入treeset中排序
String ss = s.substring(0,s.length()-1);//顺便减少每个串的最后一个字符如abc——ab
printAll(ss,ts);
}
}
}
public static int countNum(int len)
{
if(len==1)
return 1;
return len*countNum(len-1);
}
}
|
|