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


目錄

1 問題描述

2 解決方案

2.1 遞歸實現

2.2 字典序排列實現

 


1 問題描述

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

 


2 解決方案

2.1 遞歸實現

從字符串中選出一個字符作為排列的第一個字符,然后對剩余的字符進行全排列。如此遞歸處理,從而得到所有字符的全排列。

具體代碼如下:

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);
    }
}

運行結果:

abc
acb
bac
bca
cba
cab

 

2.2 字典序排列實現

思想如下:

(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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM