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)的主要内容,如果未能解决你的问题,请参考以下文章

java实现全排列问题

全排列算法--递归实现(Java)

Java与算法之 - 数字全排列

Java与算法之 - 数字全排列

算法系列学习一全排列的生成算法

[leetcode] 46. 全排列(Java)