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);//回溯 } } }