Java 实现字符串的排列
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串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);
}
}
