兩種方法:
第一種方法:
遞歸:
- 從集合中依次選出每一個(gè)元素芜茵,作為排列的第一個(gè)元素,然后對(duì)剩余的元素進(jìn)行全排列产镐,如此遞歸處理隘庄,
- 從而得到所有元素的全排列。以對(duì)字符串a(chǎn)bc進(jìn)行全排列為例磷账,我們可以這么做:以abc為例:
- 固定a峭沦,求后面bc的排列:abc,acb逃糟,求好后吼鱼,a和b交換蓬豁,得到bac
- 固定b,求后面ac的排列:bac菇肃,bca地粪,求好后,c放到第一位置琐谤,得到cba
- 固定c蟆技,求后面ba的排列:cba,cab斗忌。
- 即遞歸樹:
str: a b c
ab ac ba bc ca cb
result: abc acb bac bca cab cba
*/
//如果有重復(fù)元素质礼,將結(jié)果存到hashSet中去重
public class Permutation {
public static void permutation(String str,String result){
if(result.length()==str.length()){
System.out.println(result);
}else{
for(int i=0;i<str.length();i++){
if(result.indexOf(str.charAt(i))<0){
permutation(str,result+str.charAt(i));
}
}
}
}
public static void main(String[] args){
String str="abc";
String result="";
permutation(str,result);
}
}
第二種方法:
/*遞歸另一種寫法:
從集合中依次選出每一個(gè)元素,作為排列的第一個(gè)元素织阳,然后對(duì)剩余的元素進(jìn)行全排列眶蕉,如此遞歸處理,
- 從而得到所有元素的全排列唧躲。以對(duì)字符串a(chǎn)bc進(jìn)行全排列為例造挽,我們可以這么做:以abc為例:
- 固定a,求后面bc的排列:abc弄痹,acb饭入,求好后,a和b交換肛真,得到bac
- 固定b,求后面ac的排列:bac毁欣,bca,求好后,c放到第一位置串述,得到cba
- 固定c执解,求后面ba的排列:cba,cab纲酗。
public class Pass {
HashSet<String> set = new HashSet<String>();
public void Permutation(char[] c,int begin){
if(c.length==0)
return;
if(begin==c.length-1){
System.out.println(c);
}else{
for(int i=begin;i<c.length;i++){
Swap(c,i,begin);
Permutation(c,begin+1);//固定好當(dāng)前一位,繼續(xù)排列后面的
Swap(c,i,begin);
}
}
}
public void Swap(char[] c,int i,int begin){
if(i!=begin){
char temp=c[i];
c[i]=c[begin];
c[begin]=temp;
}
}
public static void main(String[] args) {
Pass ps=new Pass();
char[] c={'a','b','c'};
ps.Permutation(c,0);
}
}