输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
代码
1、非字典排序
/** * 递归输出字符串的全排列组合 * 将字符串分为第一个字符,及剩余字符串两部分 * 将字符串的第一个字符与剩余字符串的字符依次交换 * 对剩余字符创重复以上操作 * @param val * @param start */ private static void permutationString(StringBuffer val, int start) { // 当start到字符串末尾时,没有可交换的字符,输出此时的排列结果 if (start == val.length() - 1) { System.out.println(val); } // 将start对应的字符与后面字符串中字符依次交换位置 // i从start开始,是为了输出自身 for (int i = start; i < val.length(); i++) { // 如果要交换的位置不同,并且两个字符相等,无需交换 // 避免aaa这种字符输出多次 if (i != start && val.charAt(start) == val.charAt(i)) { continue; } // 交换两个字符的位置 swap(val, start, i); // 排除当前start对应的字符,对之后的字符串进行全排列 permutationString(val, start + 1); // 交换回两个字符的位置,从而使得start位置的字符和之后的字符进行交换 swap(val, start, i); } } private static void swap(StringBuffer val, int i, int j) { char _i = val.charAt(i); char _j = val.charAt(j); val.setCharAt(i, _j); val.setCharAt(j, _i); } public static void main(String[] args) { StringBuffer sb = new StringBuffer("abc"); Set<String> results = Sets.newHashSet(); permutationString(sb, 0); for (String s : results) { System.out.println(s); } }
2、借助TreeSet字典排序
private static void permutationString(TreeSet<String> results, StringBuffer val, int start) { // 当start到字符串末尾时,没有可交换的字符,输出此时的排列结果 if (start == val.length() - 1) { results.add(val.toString()); } // 将start对应的字符与后面字符串中字符依次交换位置 // i从start开始,是为了输出自身 for (int i = start; i < val.length(); i++) { // 如果要交换的位置不同,并且两个字符相等,无需交换 // 避免aaa这种字符输出多次 // 使用了Set集合,重复问题交由Set处理好了 //if (i != start && val.charAt(start) == val.charAt(i)) { // continue; //} // 交换两个字符的位置 swap(val, start, i); // 排除当前start对应的字符,对之后的字符串进行全排列 permutationString(results, val, start + 1); // 交换回两个字符的位置,从而使得start位置的字符和之后的字符进行交换 swap(val, start, i); } } private static void swap(StringBuffer val, int i, int j) { char _i = val.charAt(i); char _j = val.charAt(j); val.setCharAt(i, _j); val.setCharAt(j, _i); } public static void main(String[] args) { StringBuffer sb = new StringBuffer("abc"); TreeSet<String> results = Sets.newTreeSet(); permutationString(results, sb, 0); for (String s : results) { System.out.println(s); } }