需要算法来创建所有独特的组合

时间:2014-08-25 19:34:15

标签: c#

我正在尝试编写一个函数,该函数将返回给定字符串列表的指定长度的所有可能唯一集。

我目前的代码:

private void button1_Click(object sender, EventArgs e)
{
    string alpha = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
    List<string> input = alpha.Split(new char[] {','}).ToList();

    StringBuilder sb = new StringBuilder();
    foreach(HashSet<string> set in GetCombinations(input, 16))
    {
        foreach (string item in set)
        {
            sb.Append(item).Append(',');
        }
        sb.Length = sb.Length - 1;
        sb.AppendLine();
    }
    textBox1.Text = sb.ToString();
}

private IEnumerable<HashSet<string>> GetCombinations(List<string> input, int count)
{

}

在这种情况下,我需要离开......

ABCDEFGHIJKLMNOP
ABCDEFGHIJKLMNOQ
ABCDEFGHIJKLMNOR
ABCDEFGHIJKLMNOS

...等。返回的每一套必须有16个项目。

我有点难过如何做到这一点。我考虑了很多选择,但我找不到任何不笨重的东西。

1 个答案:

答案 0 :(得分:0)

这样做:

    private static void GetCombination(ref List<string[]> list, string[] t, int n, int m, int[] b, int M)
    {
        for (int i = n; i >= m; i--)
        {
            b[m - 1] = i - 1;
            if (m > 1)
            {
                GetCombination(ref list, t, i - 1, m - 1, b, M);
            }
            else
            {
                if (list == null)
                {
                    list = new List<string[]>();
                }
                string[] temp = new string[M];
                for (int j = 0; j < b.Length; j++)
                {
                    temp[j] = t[b[j]] + " ";
                }
                list.Add(temp);
            }
        }
    }

    public static List<string[]> GetCombination(string[] t, int n)
    {
        if (t.Length < n)
        {
            return null;
        }
        int[] temp = new int[n];
        List<string[]> list = new List<string[]>();
        GetCombination(ref list, t, t.Length, n, temp, n);
        return list;
    }

使用方法:

List<string[]> output = new List<string[]>();

string alpha = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
string[] input = alpha.Split(',').ToArray();

output = GetCombination(input, 16);

您将收到5311735组合,因此您可能会遇到“OutOfMemoryException”。 如果你真的需要处理这么多数据,我建议使用数据库。