生成所有可能的组合

给定2个数组Array1 = {a,b,c...n}以及Array2 = {10,20,15....x}如何生成所有可能的组合作为字符串

其中

1 <= i <= 10,  1 <= j <= 20 , 1 <= k <= 15,  .... 1 <= p <= x

如:

a1 b1 c1 .... n1  

a1 b1 c1..... n2

......

......

a10 b20 c15 nx (last combination)

因此,在所有的组合总数中=元素的乘积 array2 = (10 X 20 X 15 X ..X x)

类似于笛卡尔乘积,其中第二个数组定义第一个数组中每个元素的上限。

固定数字示例

    Array x =  [a,b,c]

Array y = [3,2,4]

因此,我们将有3 * 2 * 4 = 24个组合。结果应为:

    a1 b1 c1  

a1 b1 c2

a1 b1 c3

a1 b1 c4

a1 b2 c1

a1 b2 c2

a1 b2 c3

a1 b2 c4

a2 b1 c1

a2 b1 c2

a2 b1 c3

a2 b1 c4

a2 b2 c1

a2 b2 c2

a2 b2 c3

a2 b2 c4

a3 b1 c1

a3 b1 c2

a3 b1 c3

a3 b1 c4

a3 b2 c1

a3 b2 c2

a3 b2 c3

a3 b2 c4 (last)

回答:

using System;

using System.Text;

public static string[] GenerateCombinations(string[] Array1, int[] Array2)

{

if(Array1 == null) throw new ArgumentNullException("Array1");

if(Array2 == null) throw new ArgumentNullException("Array2");

if(Array1.Length != Array2.Length)

throw new ArgumentException("Must be the same size as Array1.", "Array2");

if(Array1.Length == 0)

return new string[0];

int outputSize = 1;

var current = new int[Array1.Length];

for(int i = 0; i < current.Length; ++i)

{

if(Array2[i] < 1)

throw new ArgumentException("Contains invalid values.", "Array2");

if(Array1[i] == null)

throw new ArgumentException("Contains null values.", "Array1");

outputSize *= Array2[i];

current[i] = 1;

}

var result = new string[outputSize];

for(int i = 0; i < outputSize; ++i)

{

var sb = new StringBuilder();

for(int j = 0; j < current.Length; ++j)

{

sb.Append(Array1[j]);

sb.Append(current[j].ToString());

if(j != current.Length - 1)

sb.Append(' ');

}

result[i] = sb.ToString();

int incrementIndex = current.Length - 1;

while(incrementIndex >= 0 && current[incrementIndex] == Array2[incrementIndex])

{

current[incrementIndex] = 1;

--incrementIndex;

}

if(incrementIndex >= 0)

++current[incrementIndex];

}

return result;

}

以上是 生成所有可能的组合 的全部内容, 来源链接: utcz.com/qa/405177.html

回到顶部