全排列两种情况:
1、没有相同元素的全排列
public class Fullsrot {
public static void main(String[] args) {
String[]strings ={"a","b","c"};
//全排
fullsort(strings,0,strings.length-1);
}
public static void fullsort(String[] strings ,int start, int end){
// 递归终止条件
if(start==end){
System.out.println(Arrays.toString(strings));
System.out.println();
return;
}
for (int i = start; i < strings.length; i++) {
swap(strings,start,i);
fullsort(strings,start+1,end);
//这个地方是重点交换后需要再换回来
swap(strings,start,i);
}
}
public static void swap(String[] strings,int x,int y){
String string = strings[x];
strings[x] = strings[y];
strings[y] = string;
}
}
2、有重复元素的全排列
分析:和上面的解决思路一样,但是我们需要检测是否重复,需要去重。这里采用的方法是利用set集合的特点同样的元素不会存储,所以最后我们将数组存储到set集合中。
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Fullsrot {
public static void main(String[] args) {
String[]strings ={"a","a","b","a"};
fullsort(strings,0,strings.length-1);
Iterator<String> it = hashSet.iterator();
while(it.hasNext()) {
String next = it.next();
System.out.println(next);
}
}
//用来存储数据的hashSet
static Set<String> hashSet=new HashSet();
public static void fullsort(String[] strings ,int start, int end){
if(start==end){
hashSet.add(Arrays.toString(strings));
return;
}
for (int i = start; i < strings.length; i++) {
swap(strings,start,i);
fullsort(strings,start+1,end);
swap(strings,start,i);
}
}
public static void swap(String[] strings,int x,int y){
String string = strings[x];
strings[x] = strings[y];
strings[y] = string;
}
}