题解 | #全排列#
首先是常规的递归,将问题分解为第一个数和后面n-1个数,解决n个数的排序就是解决其后面n-1个数的排序问题。如果只剩下最后一个数则直接输出,即递归出口。 另外题目要求按照从小多大的顺序输出,则需要借助TreeMap进行排序,在JAVA中HashMap只有去重功能,不能排序。
import java.util.*;
import java.util.TreeMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Main{
static Map<String,Integer> map=new TreeMap<String,Integer>();//进行排序
public static void permutation(char[] s,int from,int to){
if(to<1){
System.out.println(s);
return;
}
if(from==to){//只剩下一个的情况
String S=String.copyValueOf(s);
map.put(S,1);
}else{
for(int i=from;i<=to;i++){
swap(s,from,i);
permutation(s,from+1,to); //递归进行后面数字的排列
swap(s,from,i);//每一层都换回来,保证顺序不会被打乱
}
}
}
public static void swap(char[] s,int a,int b){
char tmp=s[a];
s[a]=s[b];
s[b]=tmp;
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
char[] s=in.nextLine().toCharArray();
permutation(s,0,s.length-1);
for(Entry<String,Integer> entry: map.entrySet()){
System.out.println(entry.getKey());
}
}
}