C#如何操纵一个列表,以建立不同的字符单词?

时间:2018-09-23 14:21:45

标签: c# list for-loop

我正在编写一个程序,该程序需要几个字母,从它们中构建单词,然后返回可以在单词库(例如英语词典)中找到的有意义的单词。

首先,我从两个for循环开始,这些循环接受一个字母并将所有其他字母按升序添加到该循环:如果我给出(A,D,B,H),则输出为:AD,ADB,ADBH,DA ,DAB,DABH等

var scrambledWords = new List<string>();

for (int i = 0; i < buildingMaterial.Count; i++)
{
    firstBuildUp = buildingMaterial[i];

    for (int j = 1; j < buildingMaterial.Count; j++)
    {
        if (buildingMaterial[j] == buildingMaterial[i])
            continue;

        firstBuildUp += buildingMaterial[j];
        scrambledWords.Add(firstBuildUp);
    }
}

现在,我正在尝试弄清楚获取这些字母的所有其他组合的最佳方法是什么。

  • 是否有更多for循环,但条件括号中的条件不同?
  • 是通过为每个字母创建新列表并分别处理每个列表然后将它们组合在一起来实现的吗?
  • 使用Linq吗?

我正在尝试更多具有不同条件的循环,但想知道这是否是实现我的目标的最佳方法。

1 个答案:

答案 0 :(得分:1)

您要查找的是集合的所有可能子集,或更确切地说,是集合的PowerSet。您可以使用扩展方法来查找功率集:

public static class ListExtensions
{
    public static List<List<T>> PowerSet<T>(this List<T> set)
    {
        var n = set.Count;

        var powerSetCount = 1 << n;

        var result = new List<List<T>>();

        for (var setMask = 0; setMask < powerSetCount; setMask++)
        {
            var subset = new List<T>();
            for (var i = 0; i < n; i++)
            {
                if ((setMask & (1 << i)) > 0)
                {
                    subset.Add(set[i]);
                }
            }

            result.Add(subset);
        }

        return result;
    }
}

然后像这样使用它

static class Program
{
    static void Main()
    {
        var powerSet = "abc".ToList().PowerSet();

        foreach (var set in powerSet)
        {
            // set will be a list of chars, which is equivalent to a string
            Console.WriteLine($"{new string(set.ToArray())}");
        }

        Console.ReadLine();
    }
}

输出将是:

a
b
ab
c
ac
bc
abc

请注意,空集也是PowerSet

的一部分

编辑:

字符串扩展版本:

public static class StringExtensions
{
    public static List<string> PowerSet(this string str)
    {
        var n = str.Length;

        var powerSetCount = 1 << n;

        var result = new List<string>();

        for (var setMask = 0; setMask < powerSetCount; setMask++)
        {
            var subset = new StringBuilder();
            for (var i = 0; i < n; i++)
            {
                if ((setMask & (1 << i)) > 0)
                {
                    subset.Append(str[i]);
                }
            }

            result.Add(subset.ToString());
        }

        return result;
    }
}