无知的家伙

导航

编程题:输出字符集合的所有排列组合。

问题要求:

  给出几个字符,输出字符的所有排列组合。

  如:已知 a b,可得出ab; bc;

                已知 a b c,可得出abc;  acb; cab; bac; bca; cba;

实现思路(1):

  递归算法,把集合作为字符串,每次取出一个字符,分别插入已经排列好的组合的空挡(头部,每两个字符间,尾部),形成新组合,再不断循环过程,直到最后一个字符插入时,输出。

  

 

 1 package combination;
 2 /**
 3  * 
 4  * @author xy.hong
 5  * 输出一个字符串里面所有字符的排列组合
 6  */
 7 
 8 public class Combination {
 9     private StringBuilder myString;     //字符集合作为字符串
10     private int length;       //字符集合的数量
11     private int num=0;      //记录排列的序号,用于验证排列的数量是否正确,已知字符数,则排列数量可求。从而验证程序有无错误
12     
13     public Combination(StringBuilder s){  //构造函数
14         myString=s;
15         length=s.length();
16     }
17     
18     public void printStrings(){              //调用递归函数
19         comb(0,new StringBuilder(""));
20     }
21     
22     /*
23      * void comb( 下标, 已经排列好的某个数列)   //方法说明
24      */
25     private void comb(int idex,StringBuilder sb){
26         StringBuilder s =new StringBuilder(sb);
27         
28         if(idex==length){          //如果字符已经取完,则可以输出
29             System.out.print(""+(++num)+":"+s+" ");
30             return;
31         }
32         int l=sb.length();        //已排序好的字符串的长度
33         for(int i=0; i<=l; i++){          //使用循环分别插入空挡
34             s.insert(i, myString.charAt(idex));   //插入字符
35             comb(idex+1, s);           //递归
36             s.deleteCharAt(i);            //取出插入字符,插入到下个位置
37                
38             }
39     }
40     
41     
42     public static void main(String[] args) {
43         // TODO Auto-generated method stub
44         StringBuilder s = new StringBuilder("abc");     //构造要排列的字符
45         Combination a = new Combination(s);   //构造对象
46         a.printStrings();              //输出字符
47     }
48 
49 }
Java,递归

 

缺点:运算量大,递归太慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢了。

撰写时间:2017-08-09 14:51:49

 

posted on 2017-08-09 14:54  无知的家伙  阅读(2879)  评论(0编辑  收藏  举报