我需要找到给定字符串的所有可能组合,从最小长度到最大长度。
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长度组合)。
社区可以帮我解决这个问题吗?
解决方案可以是JavaScript
,Python
甚至是伪代码。
修改
为了知识的缘故。任何人都可以回答我,在这种情况下描述结果大小的公式?我知道它不是∑(3! + 4! + … + n!)
。
答案 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提供相同最终结果的数学方法。有关该程序的进一步说明,请参阅
主题内的其他感兴趣项目
There are apparently 3072 ways to draw this flower. But why?
What is the shortest string that contains all permutations of an alphabet?
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);
}