- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Comparator;
- import java.util.Iterator;
- /*
- *编程列出一个字符串的全字符组合情况,原始字符串中没有重复字符.
- */
- class Test06 {
- public static void main(String[] args) {
- String str = "abc";
- ArrayList<String> al = all(str);
- Collections.sort(al, new strComparLength());
- System.out.println(al);
- }
- // 字符串全排列,长度从1到str.length()
- public static ArrayList<String> all(String str) {
- ArrayList<String> al = new ArrayList<String>();
- if (str.length() == 1) {
- al.add(str);
- return al;
- } else {
- String sa = str.charAt(0) + "";
- al.add(sa);
- String sub = str.replace(sa, "");
- // 对子串进行递归
- ArrayList<String> tk = all(sub);
- al.addAll(tk);
- Iterator<String> it = tk.iterator();
- String s = null;
- while (it.hasNext()) {
- s = it.next();
- for (int j = 0; j <= s.length(); j++) {
- // 遍历sa添加到s上时的位置
- al.add(s.substring(0, j) + sa + s.substring(j, s.length()));
- }
- }
- }
- return al;
- }
- // 长度为str.length()的字符串全排列。
- public static ArrayList<String> allMaxLen(String str) {
- ArrayList<String> al = new ArrayList<String>();
- if (str.length() == 1) {
- al.add(str);
- return al;
- } else {
- char[] ch = str.toCharArray();
- for (int i = 0; i < ch.length; i++) {// 对排列第1个位置上的可取字符进行遍历
- String sub = str.replace(ch[i] + "", "");
- ArrayList<String> arr = allMaxLen(sub); // 递归对除去第1个位置上字符的剩余子串进行排列
- Iterator<String> it = arr.iterator();
- while (it.hasNext()) {
- String re = ch[i] + it.next();// 合起来就是整个字符串了
- al.add(re);
- }
- }
- return al;
- }
- }
- }
- // 实现comparator接口,按照字符串的长度进行排序,若长度相等,按照字符串默认进行排序
- class strComparLength implements Comparator<String> {
- public int compare(String s1, String s2) {
- // 由于compareTo 只比较两个对象之间,所以需要把字符串长度装换成兑换后进行对比
- if (new Integer(s1.length()).compareTo(new Integer(s2.length())) < 0)
- return -1;
- else if (new Integer(s1.length()).compareTo(new Integer(s2.length())) > 0) {
- return 1;
- } else {
- return s1.compareTo(s2);
- }
- }
- }
复制代码
|
|