这个算法,跟之前的重复整形数的全排列算法是一样的,就是不同的一点都是变成了字符串,所以处理也变了一点

首先,可以将字符str,转变成 char[] datas = str..toCharArray();进行处理,方便操作;

其次,记录结果的数据集,output,可以用StringBuffer承接,append(datas[i])和deleteAt(i)是成对的。i的下标也是从0开始;

最后,要特别注意是的排序,要调用排序Arrays.sort(output),有可能有“aba”这样重复的头尾重复的,导致“datas[i]==datas[i-1]”,失效,无法去重等。

import java.util.*;


public class Solution {
     ArrayList<String> res = new ArrayList<String>();
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param str string字符串 
     * @return string字符串ArrayList
     */
    public ArrayList<String> Permutation (String str) {
        // 这里做异常处理
        if(str== null || str.length()==0) {
            return res;
        }
        StringBuffer output = new StringBuffer();
        boolean[] mark = new boolean[str.length()];
        char[] datas = str.toCharArray();
        // 这里特别重要,不排序 “aba”的数组会被重新计算,变成["aba","aab","baa","baa","aab","aba"]
        Arrays.sort(datas); 
        Arrays.fill(mark, false);

        backtrack(output, datas, mark);
        return res;
    }

    void backtrack(StringBuffer output, char[] datas, boolean[] mark) {
        if(output.length()== datas.length) {
            res.add(output.toString());
        }

        for(int i =0; i<datas.length; i++) {
            if(mark[i] || (i>0 && datas[i] == datas[i-1] && !mark[i-1])) {
                continue;
            }

            mark[i] = true;
            output.append(datas[i]);
            backtrack(output, datas, mark);
            mark[i] = false;
            output.deleteCharAt(output.length()-1);
        }
    }
}