有一個陣列,假設{A, B, C}
我想創建一個這樣的集合集合
Array Input: {A, B, C}
Output: {A, B, C},
{AB, C},
{A, BC},
{ABC}
或者在{A, B, C, D}
Array Input: {A, B, C, D}
Output: {A, B, C, D},
{AB, C, D},
{ABC, D},
{AB, CD},
{ABCD},
{A, BC, D},
{A, BCD},
{A B CD}
我正在考慮用 C# 制作它,但我還沒有解決它。
你能撰寫這個演算法嗎?
uj5u.com熱心網友回復:
是的,在一般情況下,您可以將每個可能的拆分編碼為0
or 1
( true
or false
) 以獲得所有組合:
A B C D
^ ^ ^
0 or 1 ... 0 or 1
例如:
ABCD - 000 (no splits)
A,BCD - 100 (split, then no splits)
AB,CD - 010 (no split, split, no split)
ABC,D - 001
AB,C,D - 011
A,B,CD - 110
...
A,B,C,D - 111 (all splits)
代碼:
private static IEnumerable<List<List<T>>> MySolution<T>(IEnumerable<T> source) {
if (source is null)
throw new ArgumentNullException(nameof(source));
var array = source.ToArray();
if (array.Length <= 0)
yield break;
for (int mask = 0; mask < 1 << (array.Length - 1); mask) {
List<List<T>> result = new List<List<T>>();
result.Add(new List<T>() { array[0] });
for (int index = 0; index < array.Length - 1; index) {
if ((mask & (1 << index)) != 0)
result.Add(new List<T>() { });
result[result.Count - 1].Add(array[index 1]);
}
yield return result;
}
}
演示:
char[] demo = new char[] { 'A', 'B', 'C', 'D' };
var result = MySolution(demo)
.Select(rec => "{" string.Join(", ", rec
.Select(item => string.Join("", item))) "}");
Console.WriteLine(string.Join(Environment.NewLine, result));
輸出:
{ABCD}
{A, BCD}
{AB, CD}
{A, B, CD}
{ABC, D}
{A, BC, D}
{AB, C, D}
{A, B, C, D}
uj5u.com熱心網友回復:
讓我給你一個你可以使用的方法:
你有這個串列:
{ A, B, C, D}
我建議你用一個變數替換每個逗號,我們稱之為s_i
(“s”代表“分隔符”),其中i
是某種索引,所以你得到:
Input_List = { "As_1Bs_2Cs_3D"}
分隔符可能是逗號或串聯:“、”或“”,兩者都在集合中定義C_SeparatorList
。
然后,您執行以下嵌套的 for 回圈:
foreach (i_1 in C_SeparatorList):
foreach (i_2 in C_SeparatorList):
foreach (i_3 in C_SeparatorList):
Temp = Replace(Input_List, "s_1", i_1); // replace "s_1" by i_1
Temp = Replace(Temp, "s_2", i_2);
Temp = Replace(Temp, "s_3", i_3);
Print(Temp);
next;
next;
next;
你應該得到你想要的輸出。
玩得開心實作這個:-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/490592.html