题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
解题思路
1.求出所有可能出现在第一个位置的字符(就是把第一个字符和后面所有的字符交换)(可能会有重复的字符串,用treeset来保证去重)
2.固定好第一个字符,求第二位位置可能的所有字符(递归第一步)
- 重复性字符,用set集合去重
- 按字典序打印所有的排列(collections工具类)
代码
import java.util.*;
import java.lang.Object;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> list=new ArrayList<String>();
if(str==null||str.length()==0){
return list;
}
char[] chars=str.toCharArray();
construct(chars,0,list);//从第一个位置开始排列
Collections.sort(list);//把list集合中所有的排列为字典序
return (ArrayList)list;
}
void construct(char[] chars,int i,ArrayList<String> list){
if(i==chars.length){
list.add(String.valueOf(chars));//从第0个位置到length-1都排列好了,加入到集合里面
return;
}else{
HashSet<Character> set=new HashSet<Character>();
for(int j=i;j<chars.length;j++){//chars[i]表示后面要交换的字符,用set保证去重
if(!set.contains(chars[j])){
set.add(chars[j]);
char temp=chars[i];
chars[i]=chars[j];
chars[j]=temp;
construct(chars,i+1,list);
temp=chars[j];
chars[j]=chars[i];
chars[i]=temp;//固定好第一个位置的字符(还原)
}
}
}
}
}