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