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就能得到最後結果。