public ArrayList<String> Permutation(String str) {
ArrayList<String> res = new ArrayList<>();
if(str==null) return res;
//存储字符串中每个字符的个数
Map<Character,Integer> map = new HashMap<>();
for(char c:str.toCharArray()){
int cnt = map.getOrDefault(c,0);
map.put(c,cnt+1);
}
//按顺序存储小写字母和大写字母
char[] bj =new char[52];
for(int i=0;i<26;i++){
bj[i] = (char)('A'+i);
bj[i+26]=(char)('a'+i);
}
//在递归过程中存储结果
char[] zres = new char[str.length()];
dfs(res,0,map,zres,bj);
return res;
}
private void dfs(ArrayList<String> res,int index,
Map<Character,Integer> map,
char[] zres,char[] bj){
if(index==zres.length) {
res.add(new String(zres));
return;
}
//循环遍历bj,从小到大去遍历
//每次取最小的字符存到zres中,保证按照字典序排列
for(char a:bj){
//字符串中包含这个字符并且这个字符个数不为0
if(map.containsKey(a) && map.get(a)!=0){
int cnt = map.get(a);
map.put(a,cnt-1);
zres[index]=a;
dfs(res,index+1,map,zres,bj);
map.put(a,cnt);//回溯
}
}
}