程序员面试金典-面试题 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; } }