1.采用递归的方法
全排列的本质是头部固定,不断较换尾部,直到所有元素都当过头部。
1.让每个元素都当一次首部,通过将第一个元素与当前元素和之后所有元素做交换得到每个元素都当首部的情形。(每次交换之后进行第二次递归,并将交换初始状态,才能在第二个训话交换时,让每个元素都当一次头部)
2.之后将后面其他同样的元素一样固定第二位,让后续所有元素也都出现在第二个位置上,同样通过交换操作。
import java.util.ArrayList;
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> res=new ArrayList<String>();
if(str.length()>0&&str!=null){
PermutationHelp(str.toCharArray(),0,res);
Collections.sort(res);
}
return res;
}
public static void swap(char[] cs,int i,int j){
char tmp=cs[i];
cs[i]=cs[j];
cs[j]=tmp;
}
private void PermutationHelp(char[] chars,int i,ArrayList<String> list){
if(i==chars.length-1){
list.add(String.valueOf(chars));
}else{
Set<Character> charSet=new HashSet<Character>();
for(int j=i;j<chars.length;j++){
if(!charSet.contains(chars[j])){
charSet.add(chars[j]);
swap(chars,i,j);
PermutationHelp(chars,i+1,list);
swap(chars,i,j);//每次调用完,都交换回初始状态,保证每个元素都当过首部
}
}
}
}
/*
全排列是通过交换来实现,如果只有两个数,则另一个全排列就是两个数的交换
1.不同首字母的情况都列出来,之后将递归的将后续的数字全排列。
*/
}
第一次调用PermutationHelp时,for循环循环会进行四次,每次都会执行一次PermutationHelp(chars,i+1,list)
参考:http://blog.csdn.net/u013309870/article/details/68941284