public class repeatAllArray { /* * allArray实现含有重复字符的数组的全排列 * list是含重复字符的数组,i是指示当前位置的游标,length是数组长度 * 注释:这个函数最核心的地方,我感觉是else块的代码 */ public void allArray(char list[], int i, int length) { if (i == length - 1) { for (int j = 0; j < length; j++) { System.out.print(list[j]); } System.out.println(); } else { for (int j = i; j < length; j++) { if (!isExist(list, i, j)) { swap(list, i, j);// 交换当前值和当前位置之后的值 allArray(list, i + 1, length);// 当前位置+1,递归 swap(list, i, j);// 再交换 } } } }
/* * isExist判断j位置的字符是否已经在list[0]~list[j-1]中出现过了 * list是含重复字符的数组,i是指示当前位置的游标,j是要判断的字符的位置 */ public boolean isExist(char list[], int i, int j) { for (int k = i; k < j; k++) { if (list[j] == list[k]) { return true; } } return false; }
/* * swap实现了数组中两个位置的值的交换 * list是含重复字符的数组,i,j表示要交换的位置 */ public void swap(char list[], int i, int j) { char temp = list[i]; list[i] = list[j]; list[j] = temp; }