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;
        }
    }
  • 相关阅读:
    oracelp---随意 记录(nvl)
    delphi小知识 点(if条件符,to_date)
    截取字符(pos,copy,Leftstr,MidStr,RightStr)以逗号为准把字符串拆分,判断字符串是否有数字、字母(大小写), 去掉字符串空格
    js HTML DOM TableRow 对象(innerHTML)
    mysql 安装相关
    初识JAVAScript
    css
    css深入
    css的学习
    前端 html
  • 原文地址:https://www.cnblogs.com/silentteller/p/12461893.html
Copyright © 2011-2022 走看看