求script的大小写组合,如:sCriPt,scRIPt...

ClsZH.java

 

/*
 求 script 的不同大小写组合的形式,如下:--作者:郴州拓职任文敏
 script, Script, sCript, scRipt, scrIpt, scriPt, scripT, SCript, ScRipt, ScrIpt, ScriPt, ScripT,
 sCRipt, sCrIpt, sCriPt, sCripT, scRIpt, scRiPt, scRipT, scrIPt, scrIpT, scriPT,
 SCRipt, SCrIpt, SCriPt, SCripT, ScRIpt, ScRiPt, ScRipT, ScrIPt, ScrIpT, ScriPT,
 sCRIpt, sCRiPt, sCRipT,  sCrIPt, sCrIpT, sCriPT, scRIPt, scRIpT, scRiPT, scrIPT, SCRIpt, SCRiPt,
 SCRipT, SCrIPt, SCrIpT, SCriPT, ScRIPt, ScRIpT, ScRiPT, ScrIPT,  sCRIPt, sCRIpT, sCRiPT, sCrIPT, scRIPT,
 SCRIPt, SCRIpT, SCRiPT, SCrIPT, ScRIPT, sCRIPT,
 SCRIPT
 */

import java.util.ArrayList;
import java.util.Iterator;

 

public class ClsZH {
 
//得到一个数组中不同的组合形式--从min个到max个
 //虽然本例没有使用,但在其他应用中还是可以用到的

 public ArrayList getZhFromAry(Object[] ary,int max,int min) throws Exception {
  int len = ary.length;
  if(max>len || min>=max) {
   throw new Exception("最长组合数量不应超过数组长度,并且应大于最短组合数量");
  }
  
  ArrayList lst = new ArrayList();
  int size;
  Object[] temp;
  for(int i=min;i<=max;i++) {
   int[][] results = getZH(len,i);
   size = results.length;
   for(int j=0;j<size;j++) {
    temp = new Object[i];
    for(int k=0;k<i;k++) {
     temp[k] = ary[results[j][k]];
    }
    lst.add(temp);
   }
  }
  
  return lst;
 }
 
 
//len: 从顺序的几个数中取,顺序从0开始,如len为8,表示从0~7这8个数字中取
 //qty: 组合的数字数量,如 4 ,表示从上述数组中取不同的4数组合
 //返回:所有的组合
 public int[][] getZH(int len,int qty) throws Exception {
  int[][] results = null;
  
  if(len<qty) {
   throw new Exception("无法从 "+len+" 个数中取 "+qty+"数组合!");
  }
  
  if(qty==1) {
   results = new int[len][1];
   for(int i=0;i<len;i++) {
    results[i][0] = i;
   }
   return results;
  }  
  else if(len==qty) {
   results = new int[1][qty];
   for(int i=0;i<qty;i++) {
    results[0][i] = i;
   }
   return results;
  }
  
  
//定义返回数组的一维长度
  int top = 1;
  for(int i=len;i>=len-qty+1;i--) {
   top *= i;
  }
  int bottom = 1;
  for(int i=qty;i>=2;i--) {
   bottom *= i;
  }
  int size = top/bottom;
  results = new int[size][qty];
  
  
//初始化 前qty-1个固定数数组
  int[] ary1 = new int[qty-1];
  for(int i=0;i<qty-1;i++) {
   ary1[i] = i;
  }
  
  
//调用opeZH填充返回数组
  opeZH(ary1,results,len,qty,0,size);
  
  return results;
 }
 
 
//根据前qty-1个固定数数组,循环确定最后一个数,把这些数组加入大数组
 //然后改变固定数数组的某个数及其后续数
 //不断进行递归调用
 private void opeZH(int[] ary1,int[][] results,int len,int qty,int ix,int size) {
  
//System.out.println("opeZH--" + ix);
  for(int i=ary1[qty-2]+1;i<len;i++) {
   int[] ary2 = new int[qty];
   for(int j=0;j<qty-1;j++) { 
//前qty-1个数与固定数数组一样
    ary2[j] = ary1[j];
   }
   ary2[qty-1] = i;    
//第qty个数为循环数
   results[ix] = ary2;
   ix++; 
  }
   
  
//从后向前确定哪个数要递增,该数递增后,其后的数都要改变
  for(int i=qty-2;i>=0;i--) {
   if(ary1[i]<i+len-qty) {  
    ary1[i]++;
    for(int j=i+1;j<qty-1;j++) {
     ary1[j]=ary1[j-1]+1;
    }
    break;
   } 
  }
  
 
 //如果还没有完成所有的变化,则继续递归调用自身
  if(ary1[0]<0+len-qty) {
   opeZH(ary1,results,len,qty,ix,size);
  }
  else {   
//最后一种变化
   int[] ary2 = new int[qty];
   for(int i=0;i<qty;i++) {
    ary2[i] = i+len-qty;
   }
   results[ix] = ary2;
  }
 
 }
 
 public static void main(String[] args) throws Exception {
  ClsZH zh = new ClsZH();
  
  /*
  //测试组合--由此可以看出组合的规律,从后往前看

  int len = 7;
  int qty = 1;
  int[][] results = zh.getZH(len,qty);
  int size = results.length;
  for(int i=0;i<size;i++) {
   for(int j=0;j<qty;j++) {
    System.out.print(results[i][j]+"/t");
   }
   System.out.println();
  }
  */
  
 
 /*
   //测试一个数组中 n~m 个不同的组合形式
   String[] ss = {"a","b","c","1","2","3"};
   ArrayList l = zh.getZhFromAry(ss,5,3); 
//3个到5个的组合形式
   Iterator it = l.iterator();
   Object[] temp;
   int len;
   while(it.hasNext()) {
    temp = (Object[])it.next();
    len = temp.length;
    for(int i=0;i<len;i++) {
     System.out.print(temp[i]);
    }
    System.out.println();
   }
   */
    
 
 //根据字符串的最初形态,依次将其中1~n个字符转大写,将转换后的字符串加入集合
  String str = "script";
  int len = str.length();
  int size;
  String temp;
  char[] chars = null;
  ArrayList lst = new ArrayList();
  lst.add(str);
  for(int i=1;i<=len;i++) { 
//要转换的字符数从1个字符到len个字符
   int[][] results = zh.getZH(len,i); 
//得到所有要转换的字符的下标
   size = results.length;
   for(int j=0;j<size;j++) {
    chars = str.toCharArray();
    for(int k=0;k<i;k++) {
     chars[results[j][k]] = (char)(chars[results[j][k]]-32);
    }
    temp = new String(chars);
    lst.add(temp);
   }
  }
  
  System.out.println(lst);
 }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值