字母全排列

一,算法介绍

  回溯法,让子块进行排列

二,代码

public class AllSortDemo {

    public static void main(String[] args) {
        String str = "abc";
        System.out.println(Permutation(str));
    }

    public static ArrayList<String> Permutation(String str) {
        ArrayList<String> ans = new ArrayList<>();//所有排列的可能都在这里
        if (str != null || str.length() > 0) {
            help(0, str.toCharArray(), ans);
            Collections.sort(ans);
        }

        return ans;
    }

    public static void help(int i, char[] cha, ArrayList<String> ans) {
        if (i == cha.length - 1) {
            String val = String.valueOf(cha);
            System.out.println(val);
            if (!ans.contains(val)) {
                ans.add(val);
            }
        } else {
            for (int j = i; j < cha.length; j++) {
                swap(i, j, cha);//依次选一个数固定住
                help(i + 1, cha, ans);//让后面的进行全排列
                swap(i, j, cha);//恢复原来的模样,回溯关键
            }
        }

    }

    public static void swap(int i, int j, char[] cha) {
        char temp = cha[i];
        cha[i] = cha[j];
        cha[j] = temp;
    }
}

 

posted @ 2020-10-09 23:10  superChong  阅读(271)  评论(0编辑  收藏  举报