
本文介绍如何将递归生成的嵌套式拼词路径(以键名表示匹配瓷砖)转换为清晰、可读的二维数组,每个子数组代表一种完整的单词构成方案。
在使用瓷砖(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 输出、前端渲染或组合计数分析。
通过此方法,你不仅能准确还原所有合法拼词路径,还能保持代码可读性与扩展性,为词图分析、游戏解算等场景提供坚实基础。