编程题:输出字符集合的所有排列组合。
问题要求:
给出几个字符,输出字符的所有排列组合。
如:已知 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 }
缺点:运算量大,递归太慢慢慢慢慢慢慢慢慢慢慢慢慢慢慢了。
撰写时间:2017-08-09 14:51:49
越学习越发现自己的无知