java自制全排列工具类(AllSort)
Posted Huterox
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java自制全排列工具类(AllSort)相关的知识,希望对你有一定的参考价值。
文章目录
前言
前面玩了一下,发现有个需求想要使用那个全排列,然后发现这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())
//如果有特殊需要,比如需要处理每一次排列好的值,那么可以在这里处理,curr是个ArrayList
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);//转化为Character[]
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));
以上是关于java自制全排列工具类(AllSort)的主要内容,如果未能解决你的问题,请参考以下文章