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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. /**
  2. * 编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符,例如:
  3. * 原始字符串是"abc",打印得到下列所有组合情况:
  4. * "a" "b" "c"
  5. * "ab" "bc" "ca" "ba" "cb" "ac"
  6. * "abc" "acb" "bac" "bca" "cab" "cba"
  7. */

  8. import java.util.*;
  9. class StringToArray{  
  10.     public static void main(String[] args)
  11.         {
  12.                 inputString();
  13.     }

  14.         //手动输入字符串
  15.         public static void inputString()
  16.         {
  17.                 TreeSet<String> ts = new TreeSet<String>(new StringCmp());//创建存储集合

  18.                 Scanner scanner = new Scanner(System.in);//键盘输入
  19.                 System.out.println("请输入一个字符串:");
  20.                 String str = scanner.next();//从键盘获取字符串
  21.                 char[] buf = str.toCharArray();//将字符串转换成字符数组

  22.         allArray(buf,ts,0,buf.length-1);//调用字符串全部组合函数

  23.                 Iterator<String> it = ts.iterator();//创建迭代器
  24.                 int len = 1;
  25.                 System.out.println(str+"的全部组合为"+ts.size()+"个:");
  26.                 while (it.hasNext())//按照字符串的长度迭代字符串组合
  27.                 {
  28.                         String s = it.next();
  29.                         if(len<s.length())
  30.                         {
  31.                                 len++;
  32.                                 System.out.println();
  33.                         }
  34.                         System.out.print(s+"\t");

  35.                 }

  36.                 scanner.close();
  37.         }

  38.     public static void allArray(char[] buf,TreeSet<String> ts,int start,int end)
  39.         {
  40.                 StringBuffer sb = new StringBuffer();//创建临时存储区

  41.                 for(int i=start;i<=end;i++)
  42.                 {
  43.                         swap(buf,start,i);//交换数组第一个元素与后续的元素
  44.                        
  45.                         allArray(buf,ts,start+1,end);//后续元素递归交换

  46.                         for(int j=0;j<=start;j++)
  47.                                 sb.append(buf[j]); //将各个字符添加到临时存储区

  48.                         ts.add(sb.toString());//将临时存储区的字符串添加进集合中
  49.                         sb.delete(0,start+1);  //清空临时存储区  
  50.                           
  51.                         swap(buf,start,i);//将交换后的数组还原  
  52.                 }
  53.     }

  54.         //交换数组元素
  55.         public static void swap(char[] buf,int i,int j)
  56.         {
  57.                 char temp=buf[i];
  58.                 buf[i]=buf[j];  
  59.                 buf[j]=temp;  
  60.         }
  61. }

  62. //按字符串长度排序的比较器
  63. class StringCmp implements Comparator<String>
  64. {
  65.         public int compare(String s1,String s2)
  66.         {
  67.                 int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));//按照字符串长度排序
  68.                 if(num==0)
  69.                         num = s1.compareTo(s2);//若长度相同,则按照自然顺序排序

  70.                 return num;
  71.         }
  72. }
复制代码
之前在论坛看到有发这道题的,刚开始觉得如果是固定长度为3的字符串这题也不难,但是如果长度变化的话这个就有点挑战性了,所以我花了不少时间想这题的思路,后来想到这题用递归应该可以解决问题,但是这个输出是一大问题,我就结合了TreeSet按照字母长度进行了排序,这样输出的效果就好多了


评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
看了好久,还在研究那个递归算法,牵扯到算法的东西真是令人头大!
回复 使用道具 举报
〆_、Wali 发表于 2014-10-14 23:06
看了好久,还在研究那个递归算法,牵扯到算法的东西真是令人头大!

不懂的算法我觉得一个不错的方法就是:在那个算法中各个需要运算的语句前后加上输出语句,看看它运行的步骤是什么样的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马