import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
public class Solution {
    public ArrayList<String> Permutation(String str) {
        char[] chars = str.toCharArray();
        ArrayList<String> ans = new ArrayList<>();
        boolean[] isVisited = new boolean[str.length()];
        Map<String, Integer> map = new HashMap<>();
        DFS3(ans, chars, isVisited, new StringBuilder(""), str.length(), map);
        return ans;
    }

    public void DFS3(ArrayList<String> ans, char[] chars, boolean[] isVisited,
                     StringBuilder stringBuilder, int length, Map<String, Integer> map) {
        if (length == 0 && !map.containsKey(stringBuilder.toString())) {
            ans.add(stringBuilder.toString());
            map.put(stringBuilder.toString(), 0);
            return;
        } else {
            for (int i = 0; i < chars.length; i++) {
                if (!isVisited[i]) {
                    isVisited[i] = true;
                    stringBuilder.append(chars[i]);
                    DFS3(ans, chars, isVisited, stringBuilder, length - 1, map);
                    isVisited[i] = false;
                    stringBuilder.deleteCharAt(stringBuilder.length() - 1);
                }
            }
        }
    }
}