1. 程式人生 > >全排列-遞迴去重複實現-非DFS

全排列-遞迴去重複實現-非DFS

import java.util.*;
public class Quanpaifeidigui {
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int n=in.nextInt();
            int num[]=new int[n];
            for(int i=0;i<n;i++){
                num[i]=in.nextInt();
            }
            Pailie(num,0);   //全排列
        }
    }
    public static void Pailie(int num[],int k){
        if(k==num.length-1){
            Print(num);
        }else{
            for(int i=k;i<num.length;i++){ //先保持不變,遞迴的棧的特點是最後開闢的棧先執行完畢,因此該遞迴執行的出的全排列具有一定順序
                if(IsSwap(k,i,num)){  //用於去重複,重複的排列主要是由重複的字元進行交換組成的,當發現字元在前面已經出現過時,不進行交換
                    Swap(k,i,num);
                    Pailie(num,k+1);
                    Swap(k,i,num);
                }
            }
        }
    }
    //判斷是否與後面重複
    public static boolean IsSwap(int start,int end,int num[]) {
        while(start<end){
            if(num[start]==num[end]){
                return false;
            }
            start++;
        }
        return true;
    }
    //交換函式
    public static void Swap(int x,int y,int num[]){
        int temp=num[x];
        num[x]=num[y];
        num[y]=temp;
    }
    //列印結果
    public static void Print(int num[]){
        for(int i=0;i<num.length;i++){
            if(i==0){
                System.out.print(num[i]);
            }else{
                System.out.print(" "+num[i]);
            }
        }
        System.out.println();
    }
}