【问题标题】:All possible combinations of a given string给定字符串的所有可能组合
【发布时间】:2018-06-29 05:37:17
【问题描述】:

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

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]

连接所有可能的组合,长度不超过最大参数。不应大于输入字长。

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

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

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

编辑

为了知识。谁能回答我,在这种情况下描述结果大小的公式?我知道不是@​​987654328@。

【问题讨论】:

  • 如果字符串有重复的字母,是否应该独立考虑每个字母? (如果你有“bb”,你会以“b”或“bb”还是[“bb”,“bb”]结尾?)
  • 该问题与python或JavaScript有关吗?
  • 好吧,guest271314 我是这么认为的,因为我宁愿有这些语言的编码解决方案
  • John Doe 是的,即使有重复我想计算它们
  • “那些语言”是什么意思?问题的主题是排列,而不是组合,是吗?

标签: algorithm combinatorics


【解决方案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

【讨论】:

  • 是的!我认为你很接近但是:UnboundLocalError: local variable 'combinations' referenced before assignment
  • 糟糕,我导入了一个选项并使用了另一个,哈哈。当我下班时,我很快就冲了出去。将编辑。
【解决方案2】:

[编辑]:为了知识。谁能回答我,公式 描述这种情况下的结果大小?我知道它不是 ∑(3! + 4! + ... + !)。

在下面找到三种使用 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);

}

【讨论】:

    【解决方案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')
    

    【讨论】:

    • 当我想连接 3 的组合以及 4 和 5 的组合时会发生什么?这是我缺少的部分
    • @frankies 不确定我是否理解“3 的连接组合,4 和 5 的组合”的意思。您能否详细说明您的预期结果?
    • 正如我的问题中所说。我的输入字符串是“permu”。我想要一个长度为 3 的数组,其中包含所有字母的排列,再加上一个 4 的数组,再加上一个 5 的数组。
    • 见。这不是我所期望的,因为对于长度 5,我想要所有字母的所有可能组合! 'abcde', 'cdbae', 'eabcd', ....
    • @frankies: 然后用itertools.permutations代替itertools.combinations;其余代码相同。
    【解决方案4】:

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

     import itertools
    
     min_length = 2
     max_length = 5
    
     s = 'ABCDEF'
     for i in range(min_length, max_length):
         print('length', i, 'cominations')
         print([_ for _ in itertools.combinations(s, i)])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-23
      • 2017-11-11
      • 1970-01-01
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      相关资源
      最近更新 更多