题解 | 单词搜索
单词搜索
https://www.nowcoder.com/practice/987f2981769048abaf6180ed63266bb2
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param board string字符串vector * @param word string字符串 * @return bool布尔型 */ bool vis[101][101] = {0}; int m, n; int dx[4] = {0, 0, 1, -1}; int dy[4] = {1, -1, 0, 0}; bool exist(vector<string>& board, string word) { m = board.size(), n = board[0].size(); for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) if(board[i][j] == word[0]) if(dfs(board, word, i, j, 0)) return true; return false; } bool dfs(vector<string>& board, string word, int i, int j, int pos) { if(pos == word.size() - 1) return true; vis[i][j] = true; for(int k = 0; k < 4; k++) { int a = i + dx[k], b = j + dy[k]; if(a >= 0 && a < m && b >= 0 && b < n && !vis[a][b] && board[a][b] == word[pos + 1]) { if(dfs(board, word, a, b, pos + 1)) return true; } } vis[i][j] = false; return false; } };
核心思路:
1 遍历起点: 遍历二维网格中的每个单元格, 将其作为单词搜索的起点.
2 DFS 搜索: 从起点开始, 递归地向四个方向 (上, 下, 左, 右) 搜索下一个字符.
3 回溯机制: 使用 vis 数组标记已经访问的单元格, 避免重复访问; 回溯时撤销标记, 允许其他路径使用相同的单元格.