我发现许多解决方案提供了一个以所有可能顺序组合的集合元素,但它们都只在每个结果中使用每个元素一次,而我需要将它们视为可重用。
例如,如果输入元素为 {"a", "b", "c"} 并且数字为 2,则输出为 {"a", "a"}, {"a", "b"},{“a”,“c”},{“b”,“a”},{“b”,“b”},{“b”,“c”},{“c”,“a” }, {"c", "b"}, {"a", "c"}。
最佳答案
假设您有 N 个输入元素,并且您想要一个 K 长组合。
您需要做的就是以 N 为基数进行计数,当然,范围包括所有具有 K 位数字的数字。
所以,假设 N = {n0, n1, ... nN}
您将从数字 [n0 n0 ... n0] 开始,一直数到 [nN nN ... nN]
如果您想了解如何在另一个基数中计数,您可以得到 here
您计算的每个数字都映射到您需要的 K 长组合之一。
我认为一个例子会有所帮助
我会使用你的值(value)观。 N = {a, b, c} 所以我们想以 3 为基数进行计数。 因为我们想要 2 长组合,所以我们只关心 2 位数字。 最小的 2 位基数 3 是 00,所以我们从那里开始。通过以 3 为基数计数,我们得到:
00
01
02
10
11
12
20
21
22
好的,现在将这些数字转换成一个组合。
记住,我们的集合是{a, b, c}
因此,每当我们看到 0 时,就表示 1。无论我们在哪里看到 1,它都表示 2,我相信您可以猜到 2 表示什么:)
00 aa
01 ab
02 ac
10 0 => a ba
11 1 => b bb
12 2 => c bc
20 ca
21 cb
22 cc
关于c# - 如何获得一组可复制元素的所有唯一 n 长组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257692/