C#如何实现数组相邻元素拼接生成所有可能的分组集合
问题核心逻辑
你需要生成的是输入数组所有相邻元素连续拼接的划分结果,规律非常明确:
长度为n的数组,元素之间共有n-1个间隙,每个间隙只有两种操作选择:
- 分割:间隙前后的元素归到不同分组
- 不分割:间隙前后的元素拼接为同一个分组
因此总共有2^(n-1)种划分结果,和你给出的示例数量完全匹配: - 长度为3的输入数组,共4种结果,和第一个示例一致
- 长度为4的输入数组,共8种结果,和第二个示例一致
实现时可以用位掩码标记每个间隙的分割状态,遍历所有掩码即可生成全部结果,没有重复也不会遗漏。
C# 实现代码
using System; using System.Collections.Generic; public static class ConsecutivePartitionTool { /// <summary> /// 生成数组所有相邻元素连续拼接的划分组合 /// </summary> /// <param name="input">输入的字符串数组</param> /// <returns>所有划分组合的集合</returns> public static List<List<string>> GenerateAllPartitions(List<string> input) { var result = new List<List<string>>(); int count = input.Count; if (count == 0) return result; // 总组合数:2^(n-1) int total = 1 << (count - 1); for (int mask = 0; mask < total; mask++) { var currentGroup = new List<string>(); string currentStr = input[0]; for (int i = 0; i < count - 1; i++) { // 判断当前间隙是否需要分割 bool needSplit = (mask & (1 << i)) != 0; if (needSplit) { currentGroup.Add(currentStr); currentStr = input[i + 1]; } else { currentStr += input[i + 1]; } } currentGroup.Add(currentStr); result.Add(currentGroup); } return result; } // 测试入口 public static void Main() { // 测试3元素场景 var input3 = new List<string> { "A", "B", "C" }; Console.WriteLine("Array Input: {A, B, C}"); Console.WriteLine("Output:"); foreach (var partition in GenerateAllPartitions(input3)) { Console.WriteLine($"{{{string.Join(", ", partition)}}}"); } Console.WriteLine(); // 测试4元素场景 var input4 = new List<string> { "A", "B", "C", "D" }; Console.WriteLine("Array Input: {A, B, C, D}"); Console.WriteLine("Output:"); foreach (var partition in GenerateAllPartitions(input4)) { Console.WriteLine($"{{{string.Join(", ", partition)}}}"); } } }
结果说明
运行代码后生成的结果会覆盖你给出的所有组合,仅输出顺序和你示例的顺序有差异——这是位掩码遍历的二进制位顺序导致的,如果你需要固定展示顺序,只需要根据自己的排序规则对返回的结果列表做排序即可。
内容的提问来源于stack exchange,提问作者Donuts
相关产品推荐
相关产品推荐

