import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return string字符串ArrayList
     */
    public ArrayList<String> Permutation (String str) {
        // write code here
	  // Java中的String是不可变的,需要先转换成char数组再排序
        char[] arr = str.toCharArray();
        Arrays.sort(arr);
        str = new String(arr);
        ArrayList<String> ans = new ArrayList<>();
        boolean[] vis = new boolean[str.length()];
        dfs(str, 0, ans, new StringBuilder(), vis);
        return ans;
    }
    private void dfs(String s, int pos, ArrayList<String> ans, StringBuilder sb, boolean vis[]){
        if(pos == s.length()){
            ans.add(sb.toString());
            return;
        }
	  // 每次从第一个字母开始找可以使用的字母
        for(int i = 0; i < s.length(); i++){
		  // 当前字母已使用不可再用
            if(vis[i])continue;
		  // 相同字母先使用前面一个
            if(i > 0 && s.charAt(i) == s.charAt(i-1) && !vis[i-1])continue;
		  // 回溯法
            sb.append(s.charAt(i));
            vis[i] = true;
            dfs(s, pos+1, ans, sb, vis);
            sb.deleteCharAt(sb.length()-1);
            vis[i] = false;
        }
    }
}

排序+回溯