java 对一单词的找出全部组合

单词必须是英文字母组成的,而且单词的字母不能重复。因为使用的是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;
 }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值