1. 题目解析与核心思路
这道单词搜索题是LeetCode上经典的二维网格搜索问题,属于中等难度。题目要求在一个m×n的字符网格中查找是否存在某个单词,单词的字母必须按照顺序通过相邻(上下左右)的单元格连接,且每个单元格只能使用一次。
1.1 问题特征分析
这类二维网格搜索问题通常具有以下特点:
- 有限搜索空间:网格尺寸最大为6×6,单词长度不超过15
- 路径依赖:后续字母的选择依赖于前一个字母的位置
- 状态回溯:需要记录已访问的单元格,并在搜索失败时恢复状态
1.2 解题思路选择
面对这类问题,我们通常会考虑以下几种算法:
- 深度优先搜索(DFS):适合路径探索,天然支持回溯
- 广度优先搜索(BFS):需要额外记录路径信息,实现较复杂
- 动态规划:难以处理路径不重复的限制
DFS因其简洁的实现和自然的回溯机制成为最优选择。具体来说,我们需要:
- 遍历网格找到单词首字母
- 从该位置开始DFS搜索后续字母
- 使用回溯法管理访问状态
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 深度优先搜索实现详解
2.1 基础DFS框架
DFS算法的核心是递归探索所有可能路径。对于本问题,我们需要:
- 终止条件:当匹配完所有字母时返回成功
- 递归过程:对当前字母的四个相邻位置进行探索
- 剪枝条件:越界检查、字母匹配检查、重复访问检查
2.2 关键实现细节
2.2.1 方向数组技巧
使用dx/dy数组表示四个方向的变化量:
cpp复制int dx[4] = {0, 0, -1, 1}; // 左右上下
int dy[4] = {1, -1, 0, 0};
这种写法比分别处理四个方向更简洁,也更容易扩展。
2.2.2 回溯标记方法
在DFS过程中需要标记已访问的单元格,常见方法有:
- 使用额外visited数组(空间O(mn))
- 原地修改网格值(空间O(1))
示例代码采用第二种方法,通过临时修改网格值为0来标记访问:
cpp复制char c = board[xx][yy];
board[xx][yy] = 0; // 标记访问
bool flag = dfs(xx, yy, po + 1, s, board, n, m);
board[xx][yy] = c; /
