程序员面试金典-面试题 08.08. 有重复字符串的排列组合

题目:

有重复字符串的排列组合。编写一种方法,计算某字符串的所有排列组合。

示例1:

输入:S = "qqe"
输出:["eqq","qeq","qqe"]
示例2:

输入:S = "ab"
输出:["ab", "ba"]
提示:

字符都是英文字母。
字符串长度在[1, 9]之间。

分析:

这道题所给的字符串有重复的字符,一个比较简单的做法就是结果加个set去重。不过在这里说一下交换方法。

通过交换方法可以产生排列,不过由于有重复字符,有两种情况我们不能进行交换。如aba,和baa,其中的两个a不需要进行交换。

程序:

class Solution {
    public String[] permutation(String S) {
        char[] chArray = S.toCharArray();
        Arrays.sort(chArray);
        List<String> res = new ArrayList<>();
        permutation(res, 0, chArray);
        return res.toArray(new String[0]);
    }
    private void permutation(List<String> res, int index, char[] chArray){
        if(index == chArray.length-1){
            res.add(new String(chArray));
            return;
        }
        for(int i = index; i < chArray.length; ++i){
            if(i > index && (chArray[i] == chArray[index] || chArray[i] == chArray[i-1]))
                continue;
            swap(index , i, chArray);
            permutation(res, index + 1, chArray);
            swap(index, i, chArray);
        }
    }
    private void swap(int i, int j, char[] chArray){
        char ch = chArray[i];
        chArray[i] = chArray[j];
        chArray[j] = ch;
    }
}

猜你喜欢

转载自www.cnblogs.com/silentteller/p/12461893.html