题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
思想就是利用hashSet,对字符串中的字符两两转换,hashSet中保存转换的结果,然后对字符串数组进行转换,知道得到的hashSet中的字符串数量不再改变为止。
public ArrayList<String> Permutation(String str) {
if(str==null || str.length()==0)
return new ArrayList<String>();
char[] chars = str.toCharArray();
LinkedHashSet<String> results = new LinkedHashSet<>();
ArrayList<String> strings = new ArrayList<>();
results.add(new String(chars));
strings.add(str);
int len2 =results.size();
int index = 0;
while (index<len2) {
chars = strings.get(index).toCharArray();
index++;
for (int i = chars.length - 1; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
results.addAll(getStr(chars, j, i));
}
}
strings = new ArrayList<>();
strings.addAll(results);
Collections.sort(strings);
len2=results.size();
}
Collections.sort(strings);
return strings;
}
public ArrayList<String> getStr(char[] chars,int index,int right){
ArrayList<String> strings = new ArrayList<>();
if(index>right)
return strings;
char temp = chars[index];
ArrayList<String> result = new ArrayList<>();
for(int i=index+1;i<=right;i++){
if(chars[i]==chars[i-1])
continue;
chars[index]= chars[i];
chars[i] = temp;
result.add(new String(chars));
chars[i]=chars[index];
chars[index]=temp;
}
return result;
}