字符串的全排列輸出

要求:

輸入一個字符串,去掉重複元素後,把所有字符串排列情況打印出來

如輸入abcc  ,則打印:abc,acb,bac,bca,cab,cba

代碼(用深度優先搜索實現):

import java.util.Scanner;
public class Main {
	static int []visit;//標記數組
	static char [] result;//打印結果數組
	static int n;//元素個數
	static char[] arr;//需全排列的素組
	static int first;//標記是否是第一種情況,以便不打印第一個逗號
    static void dfs(int depth){
    	//訪問了數組中所有的字符,打印出結果
    	if(depth==n){
    		if(first!=0){
    			System.out.print(",");
    		}
    		for(int i=0;i<n;i++){
    			System.out.print(result[i]);
    		}
			first++;
    	}
    	//對每個位置深搜賦值
    	else{
    		for(int i=0;i<n;i++){
    			//visit[i]==0表示arr[i]這個字符沒被訪問過
    			if(visit[i]==0){
    				//賦值到depth這個位置
    				result[depth]= arr[i];
    				//標記i這個位置的元素被訪問過,不能再用它
    				visit[i]=1;
    				//深搜下一個位置
    				dfs(depth+1);
    				//回溯到前一個位置,讓它處於未訪問過狀態
    				visit[i]=0;
    			}
    		}
    	}
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Scanner scanner=new Scanner(System.in);
        String str=scanner.next();
        char []input=str.toCharArray();
        n=0;
        first=0;
        int len=input.length;
        //arr表示去掉重複字符後的數組
        arr=new char[len];
        //去掉重複字符
        for(int k=0;k<len;k++){
        	boolean repeat=false;
        	for(int m=0;m<n;m++){
        		if(input[k]==arr[m])
        		{
        			repeat=true;
        			break;
        		}
        	}
        	if(!repeat)
        		arr[n++]=input[k];
        }
        //創建標記數組
        visit=new int[n];
        //創建要打印的結果數組
        result=new char[n];
        //進行深度優先搜索遍歷打印全排列
        dfs(0);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章