zoukankan      html  css  js  c++  java
  • 程序员面试金典-面试题 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;
        }
    }
  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/silentteller/p/12461893.html
Copyright © 2011-2022 走看看