思路:
每次都把一个数固定在前面,让后面的数递归地进行全排列,这样每个数都固定过以后就能找出所有排列。关键的地方在于,我们把每个数固定在前面并让后面的进行全排列完毕以后,要恢复原来的状态,也就需要交换回来。
import java.util.ArrayList; import java.util.Collections; public ArrayList<String> Permutation(String str) { ArrayList<String> ans=new ArrayList<String>();//所有排列的可能都在这里 if(str!=null||str.length()>0){ help(0,str.toCharArray(),ans); Collections.sort(ans); } return ans; } public static void help(int i,char[] cha,ArrayList<String> ans){ if(i==cha.length-1){ String val = String.valueOf(cha); if(!ans.contains(val)){ ans.add(val); } }else{ for(int j=i;j<cha.length;j++){ swap(i,j,cha);//依次选一个数固定住 help(i+1,cha,ans);//让后面的进行全排列 swap(i,j,cha);//恢复原来的模样,回溯关键 } } } public static void swap(int i,int j,char[] cha){ char temp=cha[i]; cha[i]=cha[j]; cha[j]=temp; } }