A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

请勿抄袭,仅供交流。这个是我的考试题答案共3种方法,大同小异。
但是最多只能排列长度为5的字符。此方法比较耗内存。
大家有没有更好的方法,欢迎交流
  1. /**
  2. * 5、 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
  3. * 原始字符串是"abc",打印得到下列所有组合情况:
  4. * "a" "b" "c"
  5. * "ab" "bc" "ca" "ba" "cb" "ac"
  6. * "abc" "acb" "bac" "bca" "cab" "cba"
  7. *
  8. * @author 王艳静
  9. */
  10. public class Test05 {
  11.         //定义类成员变量,方便类中方法调用
  12.         String str = "abc",s;
  13.         public static void main(String[] args) {
  14.                 //创建对象,方便获取类中的方法和变量
  15.                 Test05 test = new Test05();
  16.                
  17.                 //经测试,由于内存有限,只能排列长度小于6的字符串
  18.                 if(test.str.length()<6){
  19.                         System.out.println("第一种方法组合结果");
  20.                         test.show(0,new String());
  21.                         System.out.println("\r\n第二种方法组合结果");
  22.                         test.show(0,new String(),test.str);
  23.                 }

  24.                 //此方法要求字符串长度为3
  25.                 if(test.str.length()==3){
  26.                         System.out.println("\r\n第三种方法组合结果");
  27.                         test.show0();
  28.                 }
  29.         }
  30.         /* 第一种方法,迭代法。
  31.          * 参数:   level为计算迭代次数,初始值为0;
  32.          *                 temp为程序上一次迭代输出的字符串,初始值为空字符串;
  33.          *                 stemp为原始字符串减去temp剩余的字符串,初始值为原始字符串
  34.          * 思路:temp从空字符串开始,每迭代一次stemp给temp一个字符,
  35.          *     并用for循环遍历stemp中所有字符,打印所有可能,并作为参数传入下一次迭代
  36.          *
  37.          * */
  38.         public void show(int level,String temp,String stemp){
  39.                 if(level<str.length()){
  40.                         for (int i = 0; i < stemp.length(); i++) {
  41.                                
  42.                                 //元素转移过程
  43.                                 s=stemp.substring(i, i + 1);                                                       
  44.                                 String tm = new String(temp + s);
  45.                                 String stm = new String(stemp.substring(0,i)+stemp.substring(i+1,stemp.length()));
  46.                                
  47.                                 System.out.print(tm+"    ");
  48.                                 show(level+1,tm,stm);
  49.                                
  50.                         }
  51.                 }
  52.         }
  53.        
  54.         /* 第二种方法,迭代法。与第一种思想大体一致
  55.          * 传入参数level为计算迭代次数,初始值为0;temp为程序上一次迭代输出的字符串,初始值为空字符串
  56.          * 思路:temp从空字符串开始,每迭代一次往temp中添加一个temp中没有的字符(用contains(String str)来判断),
  57.          *     用for循环遍历所有字符,打印所有可能,并作为参数传入下一次迭代
  58.          *
  59.          * */
  60.         public void show(int level,String temp){
  61.                 //限制迭代次数,为字符串的长度
  62.                 if(level<str.length()){
  63.                         //在一次迭代中需遍历字符串的每个字符
  64.                         for (int i = 0; i < str.length(); i++) {
  65.                                 //获取单个字符定义为字符串(因为使用此方法contains(String str))
  66.                                 s=str.substring(i, i + 1);
  67.                                
  68.                                 if(!(temp.contains(s))){
  69.                                         String ss = new String(temp + s);
  70.                                         System.out.print(ss+"    ");
  71.                                         show(level+1,ss);
  72.                                 }
  73.                         }
  74.                 }
  75.         }

  76.         //第三种方法,为第一,二种方法提供思路。只能用作3个字符的排列,不具备通用性
  77.         public void show0(){
  78.                 char a,b,c;
  79.                 for (int i = 0; i < str.length(); i++) {
  80.                         a = str.charAt(i);
  81.                         System.out.print(str.charAt(i)+"    ");
  82.                        
  83.                         for (int j = 0; j < str.length(); j++) {
  84.                                 b = str.charAt(j);
  85.                                 if(a != b){
  86.                                         System.out.print(""+a+b+"    ");
  87.                                        
  88.                                         for (int r = 0; r < str.length(); r++) {
  89.                                                 c = str.charAt(r);
  90.                                                 if((b!=c)&&(c!=a))
  91.                                                         System.out.print(""+a+b+c+"    ");
  92.                                         }
  93.                                 }
  94.                         }
  95.                 }
  96.         }
  97. }
复制代码



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马