下面的可以任意指定字符数组,任意指定数字。这个用的不是递归的方法。- /**
- 获取获取所给字符数组中元素组成的组合。
- 例如:给的是{'a','b','c','d'}那么得到的就是a,b,c,ab,ac,,ad,bc,,bd,abc,abd,acd,bcd,abcd
- */
- private static ArrayList<String> zuHe(char[] ch) {
- ArrayList<String> ts = new ArrayList<String>();
- /**
- 数组jishu是用来记录每一个字符串的最后一个字符的在字符数组中的坐标,
- 指明下一次这个字符串应该从哪个坐标开始和字符数组中的元素进行加运算。
- 例如:对于字符串”ab",它记录的是1,那么就知道“ab"下一次应该从1+1号下标
- 开始进行加运算。
- */
- int[] jishu = new int[ch.length*(ch.length-1)];
- int[] jiu = new int[ch.length*(ch.length-1)];
- int xia = 0;
- for(int x = 0;x<ch.length;x++)
- {
- ts.add(ch[x]+"");
- jishu[xia++] = x;
- }
- fu(jishu,jiu);
- int i = 1,num = ts.size(),shu = ts.size();
- int y;
- while(i<ch.length){
- int y1 = num-shu;
- for(y=num-shu,shu =0,xia =0;y<num;y++){
- /**
- y每增加一次,就代表着1个新的字符串开始进行加运算,
- */
- for(int x = jiu[y-y1]+1;x<ch.length;x++){
- ts.add(ts.get(y)+ch[x]);
- jishu[xia++]=x;//记录下标。
- shu++;
- }
- }
- num = ts.size();
- i++;
- fu(jishu,jiu);
- }
- return ts;
- }
- private static void fu(int[] jishu,int[] jiu)//赋值,但不让后者指向前者。
- {
- for(int x=0;x<jishu.length;x++){
- jiu[x]=jishu[x];
- }
- }
- //获取指定字符个数的字符串。
- private static ArrayList<String> onlyN(char[] ch,int n)
- {
- ArrayList<String> als = new ArrayList<String>();
- ArrayList<String> als1 = zuHe(ch);
- for(String al:als1)
- {
- if(al.length() == n)
- als.add(al);
- }
- return als;
- }
复制代码 |