前言
前面玩了一下,发现有个需求想要使用那个全排列,然后发现这java里面好像是没有这个玩意的,所以我就想封装一下,然后做个工具类玩玩。这个工具类的原理是使用DFS进行深度搜索做的。
原理
这个原理很简单,我就随便说一下吧。
把这个画出来基本上,回溯就相当于写完了。
代码
class AllSort<E>{
private ArrayList<E> list;
public AllSort(ArrayList<E> list) {
this.list = list;
}
public ArrayList<ArrayList<E>> Allsort() {
boolean[] used = new boolean[list.size()];
ArrayList<ArrayList<E>> AllsortAns = new ArrayList<>();
backtrack(list,new ArrayList<>(),used,AllsortAns);
return AllsortAns;
}
private void backtrack(ArrayList<E> nums, ArrayList<E> curr, boolean[] used, ArrayList<ArrayList<E>> AllsortAns ){
if(curr.size() == nums.size()){
AllsortAns.add(new ArrayList<E>(curr));
return;
}
for (int i = 0; i < nums.size(); i++) {
if(used[i]) continue;
curr.add(nums.get(i));
used[i] = true;
backtrack(nums,curr,used,AllsortAns);
curr.remove(curr.size()-1);
used[i] = false;
}
}
}
这里做了一个小优化,就是使用那个used数组来查看那个用木有被用到,这样查找有木有重复的时间复杂度就降低了。 然后这里也是支持泛型,所以这里传递的数组必须是包装类,这个就是我觉得不太好的地方,但是谁让他降低了我的代码复用呢。
调用
调用就简单了,直接调用Allsort() 方法
lass TestAll{
public static void main(String[] args) {
String need = "abc";
Character[] characters = need.chars().mapToObj(c -> (char) c).toArray(Character[]::new);
AllSort<Character> integerAllSort = new AllSort<>(new ArrayList<Character>(Arrays.asList(characters)));
ArrayList<ArrayList<Character>> allsort = integerAllSort.Allsort();
for (int i = 0; i < allsort.size(); i++) {
System.out.println(allsort.get(i));
}
}
}
|