给定字符串的所有可能组合

时间:2018-01-19 22:07:40

标签: javascript python algorithm combinatorics

我需要找到给定字符串的所有可能组合,从最小长度到最大长度。

interface allCombos(string: String, min: Number, max:Number): Array {}

因此,如果我的输入字符串为‘abcde’,且我的最小长度为3,我希望结果为:

长度3:

[‘abc’, ‘abd’, ‘abe’, ‘acd’, ..., ‘bcd’, ‘bce’, ..., ‘eda’, ...]

与长度4连接:

[‘abcd’, ‘abdc’, ‘acdb’, ‘acbd’, …etc]

与长度最大为max参数的所有可能组合连接。其中不应高于输入字长。

我开始认为所有可能的组合都是∑(3! + 4! + … + n!)。但后来我发现我错了,因为对于每个长度子集,整个世界都有很多组合(例如6个字母串的3长度组合)。

社区可以帮我解决这个问题吗?

解决方案可以是JavaScriptPython甚至是伪代码。

修改

为了知识的缘故。任何人都可以回答我,在这种情况下描述结果大小的公式?我知道它不是∑(3! + 4! + … + n!)

4 个答案:

答案 0 :(得分:3)

您可以使用itertools.combinations

from itertools import combinations

["".join(li) for li in combinations('abcde', 3)]

这将给出

['abc', 'abd', 'abe', 'acd', 'ace', 'ade', 'bcd', 'bce', 'bde', 'cde']

简要说明:

list(combinations('abcde', 3))

将给出

[('a', 'b', 'c'),
 ('a', 'b', 'd'),
 ('a', 'b', 'e'),
 ('a', 'c', 'd'),
 ('a', 'c', 'e'),
 ('a', 'd', 'e'),
 ('b', 'c', 'd'),
 ('b', 'c', 'e'),
 ('b', 'd', 'e'),
 ('c', 'd', 'e')]

所以你的三个字母的所有组合。您可以在列表理解中加入单个元组。

如果您愿意,您当然可以轻松地将其置于循环中:

min_length = 3
max_length = 5

res = {str(i): ["".join(li) for li in combinations('abcde', i)] for i in range(min_length, max_length + 1)}

这给出了

{'3': ['abc', 'abd', 'abe', 'acd', 'ace', 'ade', 'bcd', 'bce', 'bde', 'cde'],
 '4': ['abcd', 'abce', 'abde', 'acde', 'bcde'],
 '5': ['abcde']}

如果您想将它放在一个列表中:

import numpy as np
final_list = np.concatenate(res.values())

产生

array(['abc', 'abd', 'abe', 'acd', 'ace', 'ade', 'bcd', 'bce', 'bde',
       'cde', 'abcde', 'abcd', 'abce', 'abde', 'acde', 'bcde'],
      dtype='|S5')

答案 1 :(得分:1)

我很高兴向您介绍精彩的python标准库itertools!您将需要使用组合功能。这个库很棒的是它解决了几乎所有的组合循环问题。

SELECT
    c.customer_name
    , c.date_created
    , o.grandtotal
    , o.order_date
FROM
    Customers c
    LEFT JOIN Orders o
        ON c.customer_id = o.customer_id
            AND o.order_date BETWEEN '2018-01-01' AND '2018-01-18'
WHERE
    c.customer_id IN (1, 2, 3, 4)

答案 2 :(得分:1)

其他人向你展示了一些很好的组合/排列选项,但我认为你的完整预期输出是这样的:

from itertools import combinations

def allCombos(str, min_length, max_length):
    str_combinations = []
    for length in range(min_length, max_length):
        combinations = [''.join(c) for c in combinations(str, length)]
        str_combinations.append(combinations)
    return str_combinations

答案 3 :(得分:0)

  

[编辑]:出于知识的缘故。任何人都可以回答我,那个公式   在这种情况下描述结果大小?我知道它不是Σ(3!+ 4!+ ... +   N!)。

下面找到三种使用JavaScript提供相同最终结果的数学方法。有关该程序的进一步说明,请参阅

主题内的其他感兴趣项目

const n = 4;

{
  console.log("multiplication in loop:\n");
  let l = 1,
    k;

  for (let i = k = n; l < i; k *= l++);

  console.log({
    [`${n}!`]: k
  });
}

{
  console.log("single multiplication 4 * 3 * 2 * 1:\n");
  console.log({
    [`${n}!`]: 4 * 3 * 2 * 1
  });

}

{
  console.log("multiplication in steps:\n");
  
  let curr = n;
  
  let acc = {};
  
  acc[`${curr} * ${curr - 1}`] = curr * --curr;
  
  console.log(acc);
  
  acc[`${Object.keys(acc).pop()} * ${--curr}`] = curr * +acc[Object.keys(acc).pop()];
  
  console.log(acc);
  
  acc[`${Object.keys(acc).pop()} * ${--curr}`] = curr * +acc[Object.keys(acc).pop()];
  
  console.log(acc);

}