// 题目描述
// 输入一个字符串,按字典序打印出该字符串中字符的所有排列。
// 例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
// 输入描述:
// 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
public static ArrayList<String> Permutation(String str) {
ArrayList<String> arrayList = new ArrayList<String>();
char[] chars = str.toCharArray();
Permutation(chars, 0, arrayList);
// 按字典序打印
TreeSet<String> strings = new TreeSet<String>(arrayList);
arrayList.clear();
arrayList.addAll(strings);
return arrayList;
}
public static void Permutation(char[] chars, int start, ArrayList<String> arrayList) {
//结束条件
if (start > chars.length - 1 || chars == null) {
return;
}
if (start == chars.length - 1) {
arrayList.add(String.valueOf(chars));
} else {
for (int i = start ; i < chars.length; i++) {
if (i==start){
//start 是第一个
Permutation(chars, start + 1, arrayList);
}else{
//start 不是第一个
//交换
swap(chars, start, i);
Permutation(chars, start + 1, arrayList);
//恢复
swap(chars, start, i);
}
}
}
}
public static void swap(char[] chars, int start, int end) {
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
}