昨天遇到一个和这类似的,当时没有用到递归。今天就把递归的方法放你这吧。- import java.util.ArrayList;
- class MyTest {
- public static ArrayList<String> als = new ArrayList<String>();
- static int shu = 0;
- /**shu:记录每一次新产生的字符串的个数,
- 如已知所有由3个字符所组成的字符串,在得到所有4个字符组成的字符串时,
- shu记录的就是4个字符组成的字符串的个数。*/
- public static void main(String[] args) {
- char[] ch = {'a','b','c','d','e','f','g'};
- int[] jiu = new int[ch.length*ch.length];
- ArrayList<String> ts = zuHe(ch,ch.length,jiu);
- //ArrayList<String> ts = paiLie(ch,ch.length);
- for(String str:ts){
- System.out.println(str);
- }
- }
- /**
- 获取给定字符数组中元素的组合。
- 思路:
- 用一个数组记录某一个字符串中最后一个元素所在的下标,则下一次进行加运算的时候,
- 直接从这个下标处开始。如{'a','b','c'},得到对字符串ab进行加运算时,记录的应该是'b'的下标1,
- 而ab加的第一个元素应该是1+1处的字符。
- 传入的n代表获取最大由几个字符组成的字符串。
- */
- private static ArrayList<String> zuHe(char[] ch,int n,int[] jiu) {
- int[] jishu = new int[ch.length*(ch.length-1)];
- if(n>=1)
- {
- int xia = 0;//记录下标的数组的下标
- als = zuHe(ch,--n,jiu);
- if(n ==0)
- {
- for(int x = 0;x<ch.length;x++){
- als.add(ch[x]+"");
- jishu[xia++] = x;
- shu++;
- fu(jishu,jiu);
- }
- }
- else
- {
- int size = als.size();
- /**因为在循环中还对集合添加数据,所以需要把集合中原有的长度记录下来。
- 把y定义在外面是为了在循环中定义shu = 0,xia =0;。
- 每进行一次下面的循环就意味着对集合中新添加的元素进行加运算。所以shu = 0,
- xia = 0.
- */
- int y1 = size - shu,y;
- for(y=size-shu,shu =0,xia = 0;y<size;y++)
- {
- for(int x = jiu[y-y1]+1;x<ch.length;x++)
- {
- als.add(als.get(y)+ch[x]);
- /*
- 由于这里对jishu进行了操作,所以需要用另一个数组来记录它原有的值,
- 这个数组就是jiu。
- */
- jishu[xia++]=x;
- shu++;
- }
- }
- xia = 0;
- fu(jishu,jiu);
- }
- }
- return als;
- }
- private static void fu(int[] jishu,int[] jiu){//赋值,但不使后者指向前者。
- for(int x=0;x<jishu.length;x++){
- jiu[x]=jishu[x];
- }
- }
- }
复制代码 |