Java中的全排列代碼實現

Java中的全排列代碼實現

全排列問題是指給定一個字符串或者數組,求解字符串中字符或數組中數字所有可能出現的排列。比如數組[0,1,2,3,4],求解該數組的全排列。我們在數學上碰到這種問題,第一反應肯定是先從0開始,找[1,2,3,4]的全排列;然後從1開始,找[2,3,4]的全排列;以此類推,顯然最後變成了一個遞歸問題。

public class Permutation {

    List<String> list = new ArrayList<>();

    public void permute(int[] array, int start) {
        if (start == array.length) { 
            list.add(Arrays.toString(array));//把所有可能的全排列存到list裏
        } else
            for (int i = start; i < array.length; ++i) {
                swap(array, start, i); // 交換元素
                permute(array, start + 1); // 交換後,再進行全排列
                swap(array, start, i); // 還原
            }
    }

    private void swap(int[] array, int s, int i) {
        int t = array[s];
        array[s] = array[i];
        array[i] = t;
    }

}

但是顯然,上面的代碼有一定的問題,那就是如果數組裏面出現重複元素的話的,那麼list一定會有重複的排列,如果想去掉重複元素那應該如何解決?我們最先想到的可能就是把存儲結果的容器換成HashMap,因爲HashMap的Key是唯一的,這樣可以保證沒有重複的排列。最後,我們遍歷這個HashMap的Key就能得到最後結果。

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