单词必须是英文字母组成的,而且单词的字母不能重复。因为使用的是bitset记录的组合。
刚刚写完之后,突然想到,也可以对算法进行改改,直接能求出字母重复的。用 char ch[len]=“*******”(刚开始的组合), int match[len]=.{0,1.2.。。。。。len-1}记录组合ch每个单词的下标,然后用字典排序法对0,1.。。len-1这几个数进行排列,每一个排列就是一次单词字母的下标的重新组合。这样应该就解决了吧。文采不怎么好,估计写的不怎么清楚,见谅
package functionPackage;
import java.util.Arrays;
import java.util.BitSet;
import java.util.Stack;
public class comFunc {
/**
* 对于给定的26个bit位,返回组合的可能
*/
private BitSet bit;
int len;//bit的位置是1的个数
int comLen;//组合的个数
comFunc(BitSet b)
{
len=0;
bit=b;
len=bit.cardinality();
}
private int getComNum()
{
int i,sum=1;
for(i=1;i<=len;i++)
sum*=i;
return sum;
}
public String[] mainFun()
{
Stack intsta=new Stack();
int i,j,k,m,n,h=0;
comLen=getComNum(); //获取组合数
String []strCom=new String[comLen];
int intCom[]=new int[len];
char []ch=new char[20];
//获取bitset获取组合
System.out.print("组合数是:"+comLen+"\n");
for(i=0,j=0;i<bit.size();i++)
{
if(bit.get(i)==true)
{
intCom[j++]=i;
ch[j-1]=(char)(intCom[j-1]+97);
//System.out.print(""+ch[j-1]+"");
}
}
ch[j]='\0';
strCom[0]= new String(ch,0,len);
for(i=1;i<comLen;i++)
{
m=0;
for(j=1;j<len;j++) //挑出最大的{i| intCom[j]>intCom[j-1]}
{
if(intCom[j]>intCom[j-1])
{
m=j;
}
}
k=-1;
for(j=0;j<len;j++) //挑出最大的{i|intCom[m-1]<intCom[j]}
{
if(intCom[m-1]<intCom[j])
k=j;
}
//交换 m-1 ,k
intCom[m-1]+=intCom[k];
intCom[k]=intCom[m-1]-intCom[k];
intCom[m-1]=intCom[m-1]-intCom[k];
//颠倒 m.....len-1
for(j=m;j<len;j++)
intsta.push(intCom[j]);
for(j=m;j<len;j++)
{
intCom[j]=(Integer)intsta.peek();
intsta.pop();
}
for(j=0;j<len;j++)
{
ch[j]=(char) (intCom[j]+97);
}
ch[j]='\0';
strCom[i]= new String(ch,0,len);
}
return strCom;
}
public static void main(String[] args) {
BitSet b=(new strToBitset("Tea")).trans();
comFunc c=new comFunc(b);
//c.mainFun();
String []str=c.mainFun();
for(int k=0;k<str.length;k++)
System.out.print(""+str[k]+'\n');
char t='t';
//System.out.print(""+(int)(t-'a'));
}
}
//将string 转换成bitset
class strToBitset
{
String str;
BitSet bit;
strToBitset(String s)
{
str=s.toLowerCase();
}
public BitSet trans()
{
bit=new BitSet(26);
int i,j;
for(i=0,j=0;i<str.length();i++)
{
j=(int)(str.charAt(i)-97);
bit.set(j);
}
return bit;
}
}