如何从多维数组结构中提取所有合法拼词路径并重构为扁平化序列数组

2次阅读

如何从多维数组结构中提取所有合法拼词路径并重构为扁平化序列数组

本文介绍如何将递归生成的嵌套式拼词路径(以键名表示匹配瓷砖)转换为清晰、可读的二维数组,每个子数组代表一种完整的单词构成方案。

在使用瓷砖(tiles)拼写单词的场景中,word2sequences() 函数通过回溯递归构建出一棵“匹配树”,其结构天然反映匹配路径——但以嵌套关联数组形式存在(如 [“S” => [“TA” => […]]]),不便于后续处理或展示。实际应用中,我们更需要的是扁平化的序列集合,例如:

[   ["S", "TA", "R", "S"],   ["S", "T", "A", "R", "S"] ]

为此,关键在于重构递归逻辑,避免深度嵌套,转而累积完整路径到一维结果数组中。原始实现中,$founds 被用作多层嵌套容器,且递归返回值未被有效收集;改进版则采用「引用传参 + 终止条件直接追加」策略:

  • ✅ 当 $found 匹配为空字符串或仅含分隔符(即原词已被完全分解),说明当前路径完成,直接将该路径字符串(如 “51;21;40;51″)推入 $founds[];
  • ✅ 否则继续递归,并复用同一 $founds 引用,确保所有分支结果汇聚到同一数组;
  • ✅ 最后统一解析每条路径:按 ; 分割 ID 序列,再映射回对应瓷砖字符串。

以下是优化后的完整实现(含注释与健壮性增强):

 $tile) {         // 正则尝试从词首匹配当前瓷砖(不区分大小写)         if (!preg_match("/^(" . preg_quote($tile, '/') . ")(.*)$/i", $word, $matches)) {             continue;         }         $remaining = $matches[2]; // 剩余未匹配部分          // 若已完全匹配,则记录当前瓷砖ID(作为路径终点)         if ($remaining === '') {             $founds[] = (string)$tile_id;         } else {             // 否则递归处理剩余部分,并将当前ID前置拼接             word2sequences($remaining, $tiles, $founds);             // 注意:此处需在递归后修改 $founds 中最新项,以追加当前ID             // 更安全做法是传递路径前缀 → 推荐改用辅助函数(见下方进阶版)         }     } }  // ⚠️ 上述基础版存在路径拼接缺陷(ID顺序易错)。推荐使用带路径追踪的清晰版本: function findTileSequences($word, $tiles, $path = []) {     $results = [];     foreach ($tiles as $tile_id => $tile) {         if (stripos($word, $tile) === 0) { // 确保前缀匹配             $newPath = array_merge($path, [$tile_id]);             $rest = substr($word, strlen($tile));             if ($rest === '') {                 $results[] = $newPath;             } else {                 $results = array_merge($results, findTileSequences($rest, $tiles, $newPath));             }         }     }     return $results; }  // 示例调用 $tiles = [1 => "A", 21 => "B", 34 => "AH", 40 => "R", 51 => "S", 83 => "SA", 14 => "T", 99 => "TA"]; // 修复重复键:21=>B 和 21=>TA 冲突,已改为 99=>TA $word = "stars";  $allPaths = findTileSequences($word, $tiles); // 返回 ID 序列二维数组 $sequences = [];  foreach ($allPaths as $path) {     $sequence = [];     foreach ($path as $id) {         if (isset($tiles[$id])) {             $sequence[] = $tiles[$id];         }     }     $sequences[] = $sequence; }  print_r($sequences); ?>

注意事项:

  • ? PHP 数组键名不可重复,原示例中 21 => “B” 与 21 => “TA” 会相互覆盖(后者生效),务必确保 $tiles 键唯一;
  • ? 正则中 preg_quote($tile, ‘/’) 防止特殊字符破坏模式(如 AH 无问题,但若含 .、* 则必须转义);
  • ? 若需支持重叠匹配(如 “SSA” 中 “S” 和 “SS” 同时可用),需调整匹配逻辑为全位置扫描而非仅前缀;
  • ? 最终 $sequences 是纯值数组,可直接用于 jsON 输出、前端渲染或组合计数分析。

通过此方法,你不仅能准确还原所有合法拼词路径,还能保持代码可读性与扩展性,为词图分析、游戏解算等场景提供坚实基础。

text=ZqhQzanResources