黑马程序员技术交流社区
标题:
编程列出一个字符串的全字符组合情况,原始字符串中没...
[打印本页]
作者:
小马范
时间:
2014-12-9 23:00
标题:
编程列出一个字符串的全字符组合情况,原始字符串中没...
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);
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2