使用递归的方法求字符串的全排列是一个经典方法。本文采用图+代码的方式进行理解。
1. 思考的过程
2. 参考代码
package 第六章递归;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class _02字符串的全排列 {
//使用TreeSet 去掉重复值
static Set<String> set = new TreeSet<String>();
public static void main (String[] args) {
Scanner scanner = new Scanner(System. in);
String str = scanner.nextLine();
char[] charArray = str.toCharArray();
//将字符数组转为字符串数组
String[] strs = new String[charArray. length];
for ( int i = 0; i < strs. length; i++) {
strs[i] = String. valueOf(charArray[i]);
}
set = getPermutation(Arrays.asList(strs), "" );
int count = 0;
for (String string : set) {
System. out.print(++count + string + "\t");
if(count%6==0){
System. out.println();
}
}
}
public static Set<String> getPermutation(List<String> candidate, String prefix){
if(candidate.isEmpty()){
System. out.println(prefix);
set.add(prefix);
}
for ( int i = 0; i < candidate.size(); i++) {
// LinkedList 删除操作较快
List<String> temp = new LinkedList<>(candidate);
// remove返回的是删除的元素
// remove 之后,temp 传过去的值也是少了一个的容器。这样candidate渐渐变小,才能达到递归跳出条件
getPermutation(temp, prefix+temp.remove(i));
}
return set;
}
}