import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> result = new ArrayList<>();
        if (str == null || str.length() == 0) {
            return result;
        }

        StringBuilder temp = new StringBuilder();
        boolean[] vis = new boolean[str.length()];

        recursion(result, str, temp, vis);

        //对result使用set去重
        Set<String> set = new HashSet<>(result);
        return new ArrayList<>(set);
    }

    /**
     *
     * @param res 结果集
     * @param str 原始字符串
     * @param temp 临时字符串
     * @param vis  标记字符是否加入过临时字符串
     */
    void recursion(ArrayList<String> res, String str, StringBuilder temp,
                          boolean[] vis) {
        //如果临时字符串满了,加入最终结果
        if (temp.length() == str.length()) {
            res.add(temp.toString());
            return;
        }

        //遍历所有元素选取一个加入
        for (int i = 0; i < str.length(); i++) {
            //如果该元素已经加入过了,则不需要加入了
            if (vis[i]) {
                continue;
            }

            //标记为使用过了
            vis[i] = true;
            //加入临时字符串
            char ch = str.charAt(i);
            temp.append(ch);

            recursion(res, str, temp, vis);

            //回溯
            vis[i] = false;
            temp.deleteCharAt(temp.length() - 1);
        }
    }
}