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 数组标记已经访问的单元格, 避免重复访问; 回溯时撤销标记, 允许其他路径使用相同的单元格.

京公网安备 11010502036488号