/** * 全排列递归实现 */ private List<String> quanpailie(char[] cs, int current) { //结果 List<String> result = new LinkedList<>(); //当前指向数组最后一位时,将数组(全排列的一种)输出到结果集里 if (current == cs.length - 1) { result.add(Arrays.toString(cs)); } else { //循环改变数组的第一个位置的值,并求剩下的其他字符的全排列,并装入结果集. for (int i = current; i < cs.length; i++) { //交换当前字符与下一字符 swap(cs, current, i); //这一块难理解,相当于,在A确定放在第一位的时候,求BC的全排列,并且加上A,形成ABC,ACB放入结果集. result.addAll(quanpailie(cs, current + 1)); //交换回来,方便下一次交换. swap(cs, current, i); } } return result; } /** * 交换数组第b,e位置上的值 */ private void swap(char[] cs, int b, int e) { char tmp = cs[b]; cs[b] = cs[e]; cs[e] = tmp; }