字典树排序(思路分析)

字典树排序是全排列的一种典型例题

:将某一字符串的组成字母任意变换位置,变化的种类有多少种(按字典序输出)?

(注意:可能一个字母出现不止一次)


思路:

①求 变化的种类,可以用全排列的方法;

 1.考虑用递归:模仿中序遍历、前序遍历代码格式;则想到要实现一个排列函数,在函数里调用自己。

         2.排列函数:

                2.1:首先想到要在循环中不断交换两个位置的值,还要确保能交换回来,并且在交换期间要遍历完所有情况:

                          于是将递归调用的函数写在两个swap中;

                2.2:交换的起点要不断推移,因此不能把交换起点写死,而交换的另一个点应该是在起点(包含起点,因为本身不换也是一种)到终点之间,因此要把起点最为函数形参随递归调用而向前推移。     

                2.3:递归要有出口:如果交换的起点已经在最后一点,说明已经遍历完成,该反向生成各个字符串了。

                2.4:此地鬼函数在主函数中被调用,交换起点应该设置为0,并用一个list作为形参以便进行字符串的添加。        

②要按字典序输出,可以全排列完后最后进行整体排序;

③组成的字母可能会重复,考虑用list.contains(str1)判断是否包含,因此用ArrayList来存储每个字符串。

代码:

public void Permutation(char[] arr, int i, ArrayList list) {
        if(i == arr.length - 1) {
            String str= String.valueOf(arr);
            if (!list.contains(str))
                list.add(str);
        } else {
            for(int j = i; j < arr.length; ++j) {
                swap(arr, i, j);
                PermutationHelper(arr, i + 1, list);
                swap(arr, i, j);
            }
        }
}




你可能感兴趣的:(字典树排序(思路分析))