字典树排序是全排列的一种典型例题
:将某一字符串的组成字母任意变换位置,变化的种类有多少种(按字典序输出)?
(注意:可能一个字母出现不止一次)
思路:
①求 变化的种类,可以用全排列的方法;
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);
}
}
}