数组有序拆分组合提取算法实现求助 含Java场景需求示例
算法逻辑
这个需求属于数组的有序分拆问题,核心逻辑如下:
长度为n的数组,相邻元素之间共有n-1个间隙,每个间隙可以选择拆分或者不拆分,所有拆分选择的组合最终对应所有符合要求的分组结果,总共有2^(n-1)种合法组合。
我们可以用位运算快速枚举所有间隙的拆分状态:用一个整数的二进制位表示每个间隙是否拆分,1代表拆分,0代表不拆分,遍历所有可能的整数即可得到全部分组结果。
Java 实现代码
import java.util.ArrayList; import java.util.List; public class OrderedSplit { public static void main(String[] args) { String[] array = {"AAA", "BBB", "CCC", "DDD"}; int len = array.length; // 总拆分方案数:2^(len-1) int totalPlan = 1 << (len - 1); int planNo = 0; for (int mask = 0; mask < totalPlan; mask++) { planNo++; System.out.println("// 组合" + planNo); List<List<String>> groups = new ArrayList<>(); List<String> currentGroup = new ArrayList<>(); currentGroup.add(array[0]); // 逐个判断间隙是否需要拆分 for (int i = 1; i < len; i++) { // 当前间隙对应二进制位为1则拆分 if ((mask & (1 << (i - 1))) != 0) { groups.add(currentGroup); currentGroup = new ArrayList<>(); } currentGroup.add(array[i]); } groups.add(currentGroup); // 格式化输出结果 StringBuilder output = new StringBuilder(); for (int i = 0; i < groups.size(); i++) { if (i > 0) output.append(","); output.append(groups.get(i)); } System.out.println(output); } } }
运行输出说明
上述代码针对示例数组会输出全部8种合法组合,除了你列出的6种之外,还包含两种未列全的组合:
// 组合7 ["AAA","BBB"],["CCC","DDD"] // 组合8 ["AAA","BBB","CCC","DDD"]
所有输出都严格保持原数组元素顺序,符合需求。
内容的提问来源于stack exchange,提问作者Hendy
相关产品推荐
相关产品推荐

