当前位置: 面试刷题>> 单词矩阵 (经典算法题500道)
### 题目描述补充
**单词矩阵(Word Matrix)**
给定一个二维字符矩阵(矩阵中的每个元素都是一个字符),和一个单词列表。请编写一个函数,用于找出所有在矩阵中通过水平、垂直、对角线(两个方向)或反对角线(两个方向)方式能够完整出现的单词。单词在矩阵中的路径可以是连续的字符序列,且路径上的每个字符恰好只被使用一次。
**示例输入**:
- 矩阵:
```
[
['a','b','c','e'],
['s','f','c','s'],
['a','d','e','e']
]
```
- 单词列表:`["abc", "es", "cfs"]`
**示例输出**:
- `["abc", "es"]`
注意:`"cfs"` 不在输出中,因为它不是通过连续路径形成的(尽管字符都存在,但它们不是连续的)。
### PHP 示例代码
```php
function findWords(array $board, array $words) {
$result = [];
$trie = new Trie();
foreach ($words as $word) {
$trie->insert($word);
}
$rows = count($board);
$cols = count($board[0]);
for ($i = 0; $i < $rows; $i++) {
for ($j = 0; $j < $cols; $j++) {
if ($board[$i][$j] != '#') { // 假设'#'不是单词中的字符
dfs($board, $i, $j, $trie->root, $result);
}
}
}
return $result;
}
class TrieNode {
public $children = [];
public $isWord = false;
}
class Trie {
public $root;
public function __construct() {
$this->root = new TrieNode();
}
public function insert($word) {
$node = $this->root;
for ($i = 0; $i < strlen($word); $i++) {
$char = $word[$i];
if (!isset($node->children[$char])) {
$node->children[$char] = new TrieNode();
}
$node = $node->children[$char];
}
$node->isWord = true;
}
}
function dfs(&$board, $i, $j, $node, &$result) {
$char = $board[$i][$j];
$board[$i][$j] = '#'; // 标记已访问
if (isset($node->children[$char])) {
$node = $node->children[$char];
if ($node->isWord) {
$result[] = substr(implode('', array_keys($node->children)), 0, -1);
$node->isWord = false; // 防止重复添加
}
// 四个方向搜索
$directions = [[0, 1], [1, 0], [1, 1], [1, -1]];
foreach ($directions as $dir) {
$ni = $i + $dir[0];
$nj = $j + $dir[1];
if ($ni >= 0 && $ni < count($board) && $nj >= 0 && $nj < count($board[0])) {
dfs($board, $ni, $nj, $node, $result);
}
}
}
$board[$i][$j] = $char; // 恢复字符
}
// 使用示例
$board = [
['a','b','c','e'],
['s','f','c','s'],
['a','d','e','e']
];
$words = ["abc", "es", "cfs"];
print_r(findWords($board, $words));
```
### 注意
- 上述代码示例中,使用了 Trie 树(前缀树)来快速匹配单词。
- DFS(深度优先搜索)用于在矩阵中搜索所有可能的路径。
- 示例代码假定输入的矩阵和单词列表是有效的,没有进行错误处理。
### Python 和 JavaScript 示例
由于篇幅限制,这里只提供了 PHP 的详细实现。Python 和 JavaScript 的实现逻辑相似,只是语法和类库的使用有所不同。在 Python 中,你可以使用字典来构建 Trie 树,而在 JavaScript 中,可以使用对象或 Map。DFS 的逻辑在三种语言中都是相似的,只是遍历和修改数组/矩阵的语法不同。
**码小课**网站中有更多关于算法和数据结构的内容,包括各种搜索算法、Trie 树等,欢迎大家学习交流。