题目描述
给你一个字符串,请求出利用字符串中所有字符组成的所有排列组合。
例如:abc的所有排列组合:abc、acb、bac、bca、cab、cba
思路分析
排列组合,第一个位置有n种可能,第二个位置有n-1种可能,然后依次把所有可能打印出来。怎么实现第一个位置选定后,排除掉第一个选定的字符?我采用传入char数组,然后,有个索引,i,表示当前排列到第几个位置了,i位置和后面的所有字符依次交换,来表示所有排列组合可能,不和前面已经选定的交换,来表示前面已经确定了。
代码
public static void getAllSort(String str){
if(str==null){
return;
}
ArrayList<String> list=new ArrayList<>();
proccess(str.toCharArray(),0,list);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
private static void proccess(char[] str,int i,ArrayList<String> list) {
if(i==str.length){
list.add(String.valueOf(str));
}
for(int j=i;j<str.length;j++){
swap(str,i,j);
proccess(str,i+1,list);
swap(str,i,j);
}
}
private static void swap(char[] str, int i, int j) {
char temp=str[i];
str[i]=str[j];
str[j]=temp;
}