有一个数组,比如{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#来解决这个问题,但我还没能解决这个问题。
你能对这个算法进行编码吗?
发布于 2022-06-14 07:51:21
是的,通常情况下,您可以将每一个可能的拆分编码为0或1 (true或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}https://stackoverflow.com/questions/72613010
复制相似问题