字典树排序(思路分析)

来源:互联网 发布:eve online for mac 编辑:程序博客网 时间:2024/06/05 16:21

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

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

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


思路:

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

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

         2.排列函数:

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

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

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

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

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

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

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

代码:

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);            }        }}




原创粉丝点击