黑马程序员技术交流社区

标题: 编程列出一个字符串的全字符组合情况,原始字符串中没... [打印本页]

作者: 小马范    时间: 2014-12-9 23:00
标题: 编程列出一个字符串的全字符组合情况,原始字符串中没...
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.Iterator;

  5. /*
  6. *编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符.
  7. */
  8. class Test06 {
  9.         public static void main(String[] args) {
  10.                 String str = "abc";
  11.                 ArrayList<String> al = all(str);
  12.                 Collections.sort(al, new strComparLength());
  13.                 System.out.println(al);
  14.         }

  15.         // 字符串全排列,长度从1到str.length()
  16.         public static ArrayList<String> all(String str) {
  17.                 ArrayList<String> al = new ArrayList<String>();
  18.                 if (str.length() == 1) {
  19.                         al.add(str);
  20.                         return al;
  21.                 } else {
  22.                         String sa = str.charAt(0) + "";
  23.                         al.add(sa);
  24.                         String sub = str.replace(sa, "");
  25.                         // 对子串进行递归
  26.                         ArrayList<String> tk = all(sub);
  27.                         al.addAll(tk);
  28.                         Iterator<String> it = tk.iterator();
  29.                         String s = null;
  30.                         while (it.hasNext()) {
  31.                                 s = it.next();
  32.                                 for (int j = 0; j <= s.length(); j++) {
  33.                                         // 遍历sa添加到s上时的位置
  34.                                         al.add(s.substring(0, j) + sa + s.substring(j, s.length()));
  35.                                 }
  36.                         }
  37.                 }
  38.                 return al;
  39.         }

  40.         // 长度为str.length()的字符串全排列。
  41.         public static ArrayList<String> allMaxLen(String str) {
  42.                 ArrayList<String> al = new ArrayList<String>();
  43.                 if (str.length() == 1) {
  44.                         al.add(str);
  45.                         return al;
  46.                 } else {
  47.                         char[] ch = str.toCharArray();
  48.                         for (int i = 0; i < ch.length; i++) {// 对排列第1个位置上的可取字符进行遍历
  49.                                 String sub = str.replace(ch[i] + "", "");
  50.                                 ArrayList<String> arr = allMaxLen(sub); // 递归对除去第1个位置上字符的剩余子串进行排列
  51.                                 Iterator<String> it = arr.iterator();
  52.                                 while (it.hasNext()) {
  53.                                         String re = ch[i] + it.next();// 合起来就是整个字符串了
  54.                                         al.add(re);
  55.                                 }
  56.                         }
  57.                         return al;
  58.                 }
  59.         }
  60. }

  61. // 实现comparator接口,按照字符串的长度进行排序,若长度相等,按照字符串默认进行排序
  62. class strComparLength implements Comparator<String> {
  63.         public int compare(String s1, String s2) {
  64.                 // 由于compareTo 只比较两个对象之间,所以需要把字符串长度装换成兑换后进行对比
  65.                 if (new Integer(s1.length()).compareTo(new Integer(s2.length())) < 0)
  66.                         return -1;
  67.                 else if (new Integer(s1.length()).compareTo(new Integer(s2.length())) > 0) {
  68.                         return 1;
  69.                 } else {
  70.                         return s1.compareTo(s2);
  71.                 }
  72.         }

  73. }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2