题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
import java.util.ArrayList;
import java.util.*;
public class Solution {
//思路:一个字符串的排列可以分为两个部分来看,第一个部分是第一个字母选择随机某一个字符
//然后剩下的字符再选择剩下的字符作为第一个字符,显然这是一个递归的过程,那么我们分别把
//第一个字符和后面的字符一次交换顺序,就可以得到以不同字符开头的排列,但是这里注意,因
//为存在重复的字符,因此当第一个字符和后面的字符重复的时候,不交换字符
public ArrayList<String> Permutation(String str) {
ArrayList<String> aList = new ArrayList<>();
if(str == null){
return aList;
}
PermutationCore(str.toCharArray(),0,aList);
Collections.sort(aList);
return aList;
}
public void PermutationCore(char[] chars,int begin, ArrayList<String> al){
//char[] chars = str.toCharArray();
if(begin == (chars.length-1)){
String s = String.valueOf(chars);
if(!al.contains(s))
al.add(s);
}
else{
for(int i = begin; i<chars.length; i++){
char temp0 = chars[i];
chars[i] = chars[begin];
chars[begin] = temp0;
PermutationCore(chars,begin+1,al);
char temp1 = chars[i];
chars[i] = chars[begin];
chars[begin] = temp1;
}
}
}
}