我正在编写一个程序,该程序需要几个字母,从它们中构建单词,然后返回可以在单词库(例如英语词典)中找到的有意义的单词。
首先,我从两个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);
}
}
现在,我正在尝试弄清楚获取这些字母的所有其他组合的最佳方法是什么。
我正在尝试更多具有不同条件的循环,但想知道这是否是实现我的目标的最佳方法。
答案 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;
}
}