1. 程式人生 > >利用遞迴解決全排列問題

利用遞迴解決全排列問題

什麼是排列?一般地,從n個不同元素中取出mmn)個元素,按照一定的順序排成一列,叫做從n個元素中取出m個元素的一個排列。特別地,當m=n時,這個排列被稱作全排列。

拿字串舉例,就是找出這個字串的所有元素組成的所有不同的序列,注意,這些序列具有唯一性,所以就要仔細考慮字串存在相同元素的情況。

abc這樣的一個字串,它的全排列就有:abc、acb、bac、bca、cba、cab

不妨把abc分成兩部分——字首+子字串,可以得到整個字串的全排列=字首+子字串的全排列,首先將所有元素依次放到第一個元素,將其作為字首,如axx,bxx,cxx,然後再來找剩下字串的全排列,這時我們又可以把剩下的字串分為字首+字串的形式,依次類推,直到子字串只有一個元素,那麼這個字首加上這個子字串就是原字串的其中一個全排列。程式碼如下:

import java.util.ArrayList;
import java.util.TreeSet;

public class Solution {
    public ArrayList<String> Permutation(String str) {
        if(str.length()==0){
            return new ArrayList<String>();
        }
        ArrayList<String> list = new ArrayList<String>();
        TreeSet<String> set = new TreeSet<String>();
        char[] charArray = str.toCharArray();
        
        Array(set, charArray, 0, charArray.length-1);
        for(String string:set){
            list.add(string);
        }
        return list;
    }
    
    public void Array(TreeSet<String> set, char[] charArray, int beginIndex, int endIndex){
        if(beginIndex==endIndex){
            String result = new String(charArray);
            set.add(result);
            return;
        }else{
            for(int i=beginIndex;i<=endIndex;i++){
                swap(charArray, beginIndex, i);
                Array(set, charArray, beginIndex+1, endIndex);
                swap(charArray, beginIndex, i);
            }
        }
        
    }
    
    public void swap(char[] charArray, int first, int second){
        char temp = charArray[first];
        charArray[first] = charArray[second];
        charArray[second] = temp;
    }
}