我需要找到给定字符串的所有可能组合,从最小长度到最大长度。
interface allCombos(string: String, min: Number, max:Number): Array {}
因此,如果我的输入字符串是‘abcde’,并且我的最小长度是3,则我希望结果是:
‘abcde’
对于长度3:
[‘abc’, ‘abd’, ‘abe’, ‘acd’, ..., ‘bcd’, ‘bce’, ..., ‘eda’, ...]
与长度4串联:
[‘abcd’, ‘abdc’, ‘acdb’, ‘acbd’, …etc]
长度不超过max参数的所有可能组合。不应超过输入字长。
我开始认为所有可能的组合都是∑(3! + 4! + … + n!)。但是后来我发现我错了,因为对于每个长度的子集,整个世界都有许多组合(例如6字母字符串的3长度组合)。
∑(3! + 4! + … + n!)
社区可以帮助我解决这个问题吗?
解决方案可以是JavaScript,Python甚至可以是伪代码。
JavaScript
Python
编辑
为了知识。在这种情况下,有人可以回答我,描述结果大小的公式吗?我知道不是 ∑(3! + 4! + … + n!)。
您可以itertools.combinations为此使用:
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')