描述
输入一个字符串,打印出该字符串的所有排列。例如,输入字符串”abc”,则输出有字符’a’,’b’,’c’所能排列出来的所有字符串”abc”,”acb”,”bac”,”bca”,”cab”,”cba”。
解决方案
递归实现
从字符串中选出一个字符作为排列的第一个字符,然后对剩余的字符进行全排列。如此递归处理,从而得到所有字符的全排列。
/* * 参数arrayA:给定字符串的字符数组 参数start:开始遍历字符与其后面各个字符将要进行交换的位置 参数end:字符串数组的最后一位 * 函数功能:输出字符串数字的各个字符全排列 */ public void recursionArrange(char[] arrayA, int start, int end) { if (end < 1) return; if (start == end) { System.out.println(String.valueOf(arrayA)); } else { for (int i = start; i <= end; i++) { swap(arrayA, i, start); recursionArrange(arrayA, start + 1, end); swap(arrayA, i, start); } } } // 交换数组m位置和n位置上的值 public void swap(char[] arrayA, int m, int n) { if (m == n) { return; } char temp = arrayA[m]; arrayA[m] = arrayA[n]; arrayA[n] = temp; } public static void main(String[] args) { StringTest test = new StringTest(); String A = "abc"; char[] arrayA = A.toCharArray(); test.recursionArrange(arrayA, 0, arrayA.length - 1); }
代码优化点
其实end没有用到,可以去掉end,用 arrayA.length替代,省去了end作为入参。