算法筆記_025:字符串的全排列(Java)

目錄數組

1 問題描述
函數

2 解決方案
spa

2.1 遞歸實現
code

2.2 字典序排列實現
blog

 


1 問題描述

輸入一個字符串,打印出該字符串的全部排列。例如,輸入字符串」abc」,則輸出有字符’a’,’b’,’c’所能排列出來的全部字符串」abc」,」acb」,」bac」,」bca」,」cab」,」cba」。遞歸

 


2 解決方案

2.1 遞歸實現

從字符串中選出一個字符做爲排列的第一個字符,而後對剩餘的字符進行全排列。如此遞歸處理,從而獲得全部字符的全排列。字符串

具體代碼以下:string

package com.liuzhen.string_1;

public class StringArrange {//方法1:遞歸實現
    /*
     * 參數arrayA:給定字符串的字符數組
     * 參數start:開始遍歷字符與其後面各個字符將要進行交換的位置
     * 參數end:字符串數組的最後一位
     * 函數功能:輸出字符串數字的各個字符全排列
     */
    public void recursionArrange(char[] arrayA,int start,int end){
        if(end <= 1)   
             return;
        if(start == end){
            for(int i = 0;i < arrayA.length;i++)
                System.out.print(arrayA[i]);
            System.out.println();
        }
        else{
            for(int i = start;i <= end;i++){
                swap(arrayA,i,start);
                recursionArrange(arrayA,start+1,end);
                swap(arrayA,i,start);
            }
        }
        
    }
    //交換數組m位置和n位置上的值
    public void swap(char[] arrayA,int m,int n){
        char temp = arrayA[m];
        arrayA[m] = arrayA[n];
        arrayA[n] = temp;
    }
    
    public static void main(String[] args){
        StringArrange test = new StringArrange();
        String A = "abc";
        char[] arrayA = A.toCharArray();
        test.recursionArrange(arrayA,0,arrayA.length-1);
    }
}

運行結果:io

abc
acb
bac
bca
cba
cab

 

2.2 字典序排列實現class

思想以下:

(1)找到排列中最後(最右)一個升序的首位位置i

(2)找到排列中第i位右邊最後一個比ai大的位置j

(3)交換aiaj的值。

(4)把第i+1位到最後一位的部分進行逆序反轉。

具體代碼以下:

package com.liuzhen.string_1;

public class StringArrange {
    //方法2:字典序排列
    /*
     * 參數arrayA:給定字符串的字符數組
     * 函數功能:輸出字符串數組的全部字符的字典序全排列
     */
    public void dictionaryArrange(char[] arrayA){
        System.out.println(String.valueOf(arrayA));
        while(allArrange(arrayA))
            System.out.println(String.valueOf(arrayA));
    }
    //判斷當前數組arrayA序列是否能夠進行字典序排列,如能夠則進行排列並返回true,不然返回false
    public boolean allArrange(char[] arrayA){
        int i;
        for(i = arrayA.length-2;(i >= 0) && arrayA[i] > arrayA[i+1];--i);
        if(i < 0)
            return false;
        int k;
        for(k = arrayA.length-1;(k > i) && arrayA[i] >= arrayA[k];--k);
        swap(arrayA,i,k);
        reverseArray(arrayA,i+1,arrayA.length-1);
        return true;
    }
    //將數組中a[m]到a[n]一段元素反序排列
    public void reverseArray(char[] arrayN,int m,int n){
        while(m < n){
            char temp = arrayN[m];
            arrayN[m++] = arrayN[n];
            arrayN[n--] = temp;
        }
    }
    //交換數組m位置和n位置上的值
    public void swap(char[] arrayA,int m,int n){
        char temp = arrayA[m];
        arrayA[m] = arrayA[n];
        arrayA[n] = temp;
    }
public static void main(String[] args){ StringArrange test = new StringArrange(); String A = "abc"; char[] arrayA = A.toCharArray(); test.dictionaryArrange(arrayA); } }

 運行結果:

abc
acb
bac
bca
cab
cba
相關文章
相關標籤/搜索