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










