字符串的全排列問題的解決方法

package exampletest;

import java.util.ArrayList;
import java.util.Scanner;
public class Main01 {

    public static void main(String[] args) {
        String str = "ABCD";
        ArrayList<String> list = new ArrayList<>();
        Permutation(list,str.toCharArray(),0);
        System.out.println(list);
    }

    /**
     * 字符串全排列問題:ABC
     * 如果能生成n-1個元素的全排列,則能生成n個元素的全排列。
     * 1)固定第一個字符A,求後面兩個字符BC的排列;
     * 2)當兩個字符BC排列好後,把第一個字符A和B交換,得到BAC,接着固定第一個字符B,求後面AC的排列。
     * 3)現在把C放在第一個位置,由於前面已經交換了AB,爲了保證這次C仍是和原先處在第一個位置的A交換,
     * 在交換C之前,先要把B和A交換回來。在交換B和A之後,再拿C和處於第一位置的A進行交換,得到CBA。
     * 再次固定第一個字符C,求後面兩個字符B、A的排列。
     * @param list
     * @param ch
     * @param n
     */
    public static void Permutation(ArrayList<String> list ,char[] ch ,int n){
         if (n == ch.length){
             //交換一次完成記錄
             list.add(new String(ch));
         }
        for (int i = n; i < ch.length; i++) {
            //交換字符串長度的次數
            swap(ch,i,n);//交換後面的 步驟2)
            Permutation(list,ch,n+1);
            swap(ch,i,n);//交換前面的 步驟3)
        }

    }

    /**
     * 交換字符
     * @param ch
     * @param i
     * @param j
     */
    public static void swap(char[] ch,int i,int j){
        if (i != j){
            char c = ch[i];
            ch[i] = ch[j];
            ch[j] = c;
        }
    }
}

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