题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路:其实核心就是每次从剩余的N个数字中选出一个字符。存在一种情况就是剩余的字符中有重复的,比如剩余的字符为aabc,那么第一次选一个a出来和第二次选一个a其实是重复的。所以我们要直接跳过第二次的,直接选择b就好。
所以我先做了一个排序,然后再取字符,如果这次取的字符和上一次取的一样,则跳过当次取字符。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
* 字符串的排列
* 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
* 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
//按照字典顺序打印
String str = "baaa";
solution.Permutation(str);
System.out.println(solution.list.size());
}
ArrayList<String> list = new ArrayList<>();
public ArrayList<String> Permutation(String str) {
if (str == null || str.length() == 0) {
return new ArrayList<>();
}
ArrayList<Integer> splitList = new ArrayList<>();
for (int i = 0; i < str.length(); i++) {
splitList.add((int) str.toCharArray()[i]);
}
Collections.sort(splitList, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 > o2 ? 1 : -1;
}
});
addString(splitList, "");
return list;
}
public void addString(ArrayList<Integer> stringList, String str) {
if (stringList.size() == 0) {
list.add(str);
return;
}
for (int i = 0; i < stringList.size(); i++) {
ArrayList<Integer> copy = new ArrayList<>();
copy.addAll(stringList);
if (i == 0) {
copy.remove(i);
addString(copy, str + (char) ((int) stringList.get(i)));
} else if (stringList.get(i - 1) != (stringList.get(i))) {
copy.remove(i);
addString(copy, str + (char) ((int) stringList.get(i)));
}
}
}
}