1. 问题描述与理解
单词搜索是一个经典的二维矩阵搜索问题,要求在一个n×m的字符矩阵中查找是否存在一条路径,使得路径上的字符按顺序连接起来恰好构成给定的单词。路径的移动规则是只能向上、下、左、右四个方向移动,不能重复使用同一个位置的字符。
1.1 问题核心要素
- 矩阵规模:n行m列,其中0 < n,m < 21
- 单词长度:不超过100个字符
- 匹配规则:区分大小写,路径必须连续且不重复访问同一位置
- 输出要求:找到则返回首字母位置(行列号从1开始),否则返回"NO"
1.2 示例分析
以第一个测试用例为例:
code复制5 5
HELLOWORLD
CPUCY
EKLQH
CHELL
LROWO
DGRBC
需要找到"H->E->L->L->O->W->O->R->L->D"的路径。正确的路径起始于第3行第2列的'H',因此输出"3 2"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计与思路
2.1 回溯算法原理
回溯算法是解决这类搜索问题的经典方法。其核心思想是:
- 从矩阵的每个位置出发,尝试匹配单词的第一个字符
- 如果匹配成功,则向四个方向递归搜索下一个字符
- 使用访问标记数组避免重复访问同一位置
- 如果某条路径失败,回溯并尝试其他方向
2.2 算法复杂度分析
- 时间复杂度:O(N×M×4^L),其中L是单词长度
- 空间复杂度:O(N×M)用于存储访问标记
注意:虽然最坏情况下时间复杂度较高,但由于题目限制矩阵最大20×20且单词只出现一次,实际性能是可接受的。
3. 代码实现详解
3.1 JavaScript实现
javascript复制function canFind(matrix, n, m, word) {
const len = word.length;
const visited = new Array(n).fill(0).map(() => new Array(m).fill(false));
const backTracking = (i, j, k) => {
if (k === len) return true;
if (i < 0 || i >= n || j < 0 || j
