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就能得到最后结果。