【题目】
算法是这样的,如果给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种。
如:给定 A、B、C三个不同的字符,则结果为:ABC、ACB、BAC、BCA、CAB、CBA一共3!=3*2=6种情况。
【分析】
求全排列是很常见的题目类型,在找所有可能性的时候,我们用到了交换的思想:a[0]和后面所有的元素交换位置,是一种不同的排列,应用上递归的思想,后面的子数组也是用相同的交换去找出不同的排列。
但是要注意去除重复的排列。
【源码】
private static char[] a;
private static TreeSet<String> resultSet; //帮助排序,帮助去重
public static void main(String[] args) {
String s = "abcd";
a = s.toCharArray();
resultSet = new TreeSet<String>();
f(0);
for (String s1 : resultSet) {
System.out.println(s1);
}
System.out.println(resultSet.size());
}
private static void f(int index){
if(index == a.length-1){
return;
}
for(int i=index; i<a.length; i++){
{
char temp = a[i];
a[i] = a[index];
a[index] = temp;
}
//新的排列产生
resultSet.add(Arrays.toString(a));
f(index+1);
{
//回溯
char temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
}
【结果】
[A, B, C]
[A, C, B]
[B, A, C]
[B, C, A]
[C, A, B]
[C, B, A]
6