0. 全排列
对于拥有四个元素(各不相同)的数组进行全排列有多少种不同排列方案?
答案:4 * 3 * 2 = 24 种
从上面的全部写出来的结果中有没有看出来什么?
1 和 1号位置、1 和 2号位置、1 和 3号位置、1 和 4号位置 均换过位置
对于1:来说,2 和 2号位置、2 和 3号位置、2 和 4号位置 均换过位置;3 和 3号位置、3 和 4号位置 均换过位置;
可能解释的不够清楚,看下面的代码吧!
1. 未去重代码?:
public class Main {
public static void main(String[] args) {
String str = "123";
func(str.toCharArray(), 0);
}
private static void swap(char[] charArray, int i, int j){
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
}
private static void func(char[] charArray, int start){
if (start == charArray.length - 1){
System.out.println(new String(charArray));
}else{
for(int i = start; i <= charArray.length - 1; i ++){
swap(charArray, start, i);
func(charArray, start + 1);
swap(charArray, start, i);
}
}
}
}
2. 去重代码?:
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
public class Main {
private static Set<String> set = new TreeSet<>();
public static void main(String[] args) {
String str = "1223";
func(str.toCharArray(), 0);
System.out.println(Arrays.toString(set.toArray()));
}
private static void swap(char[] charArray, int i, int j){
char temp = charArray[i];
charArray[i] = charArray[j];
charArray[j] = temp;
}
private static void func(char[] charArray, int start){
if (start == charArray.length - 1){
set.add(new String(charArray));
}else{
for(int i = start; i <= charArray.length - 1; i ++){
swap(charArray, start, i);
func(charArray, start + 1);
swap(charArray, start, i);
}
}
}
}