题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思路:
1.用排序树的思想来实现,建立一个链表存储,然后对满足条件进行存储
2.通过排序树的树思想对数据进行全排序。和交换。
3.对存入的数据进行排序最后返回。
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> ans=new ArrayList<>();//所有排列的可能都在这里
if(str!=null||str.length()>0){
help(0,str.toCharArray(),ans);
Collections.sort(ans);
}
return ans;
}
//i=0
public static void help(int i,char[] cha,ArrayList<String> ans){
//把满足条件的存入到字符串存入到arraylist
if(i==cha.length-1){
//字符数组转字符串
String val = String.valueOf(cha);
if(!ans.contains(val)){
ans.add(val);
}
}else{
//进行排列
for(int j=i;j<cha.length;j++){
swap(i,j,cha);//依次选一个数固定住
help(i+1,cha,ans);//让后面的进行全排列
swap(i,j,cha);//恢复原来的模样,回溯关键
}
}
}
//交换,字符串的交换
public static void swap(int i,int j,char[] cha){
char temp=cha[i];
cha[i]=cha[j];
cha[j]=temp;
}
}