如何使用c#查找集合的所有子集?这里设置的是一个句子(字符串)。例如: s =“我是nik”;代码是什么?
这里s的子集将是>我,我,尼克,我,我,尼克,我是尼克。
答案 0 :(得分:6)
这是我写的一个函数,用于查找给定数组中所有不相关的子集。
List<T[]> CreateSubsets<T>(T[] originalArray)
{
List<T[]> subsets = new List<T[]>();
for (int i = 0; i < originalArray.Length; i++)
{
int subsetCount = subsets.Count;
subsets.Add(new T[] { originalArray[i] });
for (int j = 0; j < subsetCount; j++)
{
T[] newSubset = new T[subsets[j].Length + 1];
subsets[j].CopyTo(newSubset, 0);
newSubset[newSubset.Length - 1] = originalArray[i];
subsets.Add(newSubset);
}
}
return subsets;
}
因此给定1,2,3,4,5的整数数组,它将返回包含31个子集的List<int[]>
。
编辑:根据您的更新,您可以使用上述功能生成所需的6个子集,并在原始句子上使用string.Split('')。考虑:
string originalString = "i am nik";
List<string[]> subsets = CreateSubsets(originalString.Split(' '));
foreach (string[] subset in subsets)
{
Console.WriteLine(string.Join("\t", subset));
}
答案 1 :(得分:1)
// all subsets of given set
static void numbcomb (string [] list)
{
int gelen = (int)Math.Pow(2,list.Length); // number of subsets (2^n)
string [] result = new string [gelen]; // array with subsets as elements
for(int i=0; i<gelen; i++) // filling "result"
{
for(int j=0;j<list.Length;j++) // 0,1,2 (for n=3)
{
int t = (int)Math.Pow(2, j); // 1,2,4 (for n=3)
if ((i&t)!=0) // the MAIN THING in the program
// i can be:
// 000,001,010,011,100,101,110,111
// t can be: 001,010,100
// take a pensil and think about!
{ result[i]+=list[j]+" ";} // add to subset
}
Console.Write("{0}: ",i);// write subset number
Console.WriteLine(result[i]);//write subset itself
}
}