• 程序员面试金典-面试题 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;
        }
    }
  • 相关阅读:
    Educational Codeforces Round 23 D. Imbalanced Array(单调栈)
    hdu 4355 Party All the Time(三分)
    Educational Codeforces Round 21 F. Card Game(网络流之最大点权独立集)
    qscoj Round 1(div 2)
    玲珑杯 ACM Round #10
    hihoCoder #27
    Codeforces Round #396(div 2)
    高数A(下)第九章
    Mutual Training for Wannafly Union #5
    寒假集训补完
  • 原文地址:https://www.cnblogs.com/silentteller/p/12461893.html
Copyright © 2020-2023  润新知