
本文介绍一种基于递归与偏移量跟踪的算法,用于将具有层级结构的嵌套数组(如树形分支)展开为所有可能的字符串路径组合,适用于构建笛卡尔积式路径、菜单路径生成等场景。
本文介绍一种基于递归与偏移量跟踪的算法,用于将具有层级结构的嵌套数组(如树形分支)展开为所有可能的字符串路径组合,适用于构建笛卡尔积式路径、菜单路径生成等场景。
在处理多层嵌套的分支结构时(例如菜单树、配置路径或状态机分支),常需将每一级的候选项“按顺序绑定”到上一级结果上——这并非标准笛卡尔积,而是一种层级对齐式展开:第 i 层的每个子数组,仅作用于第 i−1 层对应位置生成的前缀,形成一一映射关系。
上述问题的本质是:给定一个数组 data,其中
- data[0] 是根级字符串数组(如 ["a", "b"]);
- data[1] 是长度为 2 的数组,其第 0 项 ["c","d"] 应扩展 data[0][0](即 "a"),第 1 项 ["e","f","g"] 应扩展 data[0][1](即 "b");
- data[2] 同理,需按顺序匹配前一层展开后的每个结果(共 5 个前缀),依次应用对应子数组。
因此,不能使用简单笛卡尔积(会爆炸式组合),而需维护一个偏移量数组 offsets,记录当前递归深度下,各层级正在处理的子数组索引。
以下是经过优化、可读性强的实现:
function distributeTree(data) {
// 递归核心:index 表示当前处理层级,offsets 记录每层已取子数组的索引
function combine(index = 0, offsets = [0]) {
// 初始化下一层偏移量(懒初始化)
if (offsets.length <= index + 1) {
offsets[index + 1] = 0;
}
// 递归终止:到达末尾,返回空字符串作为基础单位(便于拼接)
if (index >= data.length) {
return [''];
}
// 当前层级的数据源:
// - 若 index === 0,直接取 data[0](根数组)
// - 否则取 data[index][offsets[index]](对应前缀所绑定的子数组)
const currentItems = index === 0
? data[0]
: data[index][offsets[index]];
// 对 currentItems 中每个元素,递归获取后续路径,并拼接
return currentItems.flatMap(item => {
const suffixes = combine(index + 1, offsets);
const result = suffixes.map(suffix => item + suffix);
// 关键:当前分支处理完毕后,推进下一层偏移量(模拟“换行”)
offsets[index + 1]++;
return result;
});
}
return combine();
}
// 测试用例
const input = [
["a", "b"],
[["c", "d"], ["e", "f", "g"]],
[["h", "i"], ["j"], ["k", "l"], ["m"], ["n", "o", "p"]]
];
console.log(distributeTree(input));
// 输出: ["ach", "aci", "adj", "bek", "bel", "bfm", "bgn", "bgo", "bgp"]✅ 关键设计说明:
- offsets[i] 表示在第 i 层(即 data[i])中,当前正处理第几个子数组(data[i][offsets[i]]);
- 每次进入 flatMap 处理一个前缀项时,combine(index + 1, offsets) 会复用并更新 offsets[index + 1],确保下一层严格按顺序消费对应子数组;
- 返回 [''] 作为递归基,使字符串拼接自然成立(如 "x" + "" === "x");
- 使用 flatMap 替代循环 + push,语义更清晰,且自动展平多层结果。
⚠️ 注意事项:
- 输入必须满足结构约束:data[0] 为字符串数组;对 i > 0,data[i] 必须是数组,且 data[i].length 应等于前一层展开后的总项数(否则 offsets[i] 可能越界);
- 若需健壮性,可在访问 data[index][offsets[index]] 前添加存在性校验;
- 此算法时间复杂度为 O(N)(N 为最终结果总字符数),空间复杂度取决于最大递归深度,适用于中等规模树结构。
该方法精准建模了“分支对齐展开”的业务语义,比通用笛卡尔积更高效、更可控,是处理层级化路径生成的理想方案。


















