参考大佬的博客
问题描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
问题分析
- String.valueOf() 方法将不同类型打印成字符串。
- Collection.sort()
- 将字符串排序的流程即从第1位开始和后面每位数进行交换然后递归到第二位进行同样操作。
如果字符串中含有相同的字符则需要注意!
去重的全排列就是从第一个数字起,每个数分别与它后面非重复出现的数字交换。 - 这次同样要注意保持原有数据结构不变!
- 具体由在递归后加一个swap,将替换的元素替换回来完成。
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> arrayList=new ArrayList<>();
char[] chars=str.toCharArray();
Permutation(arrayList,0,chars);
Collections.sort(arrayList);
return arrayList;
}
private void Permutation(ArrayList<String> arrayList,int i,char[] chars){
if (i==chars.length-1)
arrayList.add(String.valueOf(chars));
Set<Character> set=new HashSet<>();
for (int j=i;j<chars.length;j++){
if (i==j||!set.contains(chars[j])){
set.add(chars[j]);
swap(chars,j,i);
Permutation(arrayList,i+1,chars);
swap(chars,j,i);
}
}
}
private void swap(char[] chars,int i,int j){
char temp=chars[i];
chars[i]=chars[j];
chars[j]=temp;
}
}