题目描述
知识点
深度优先搜索(DFS)
解题思路
- 用
index
表示word
的索引,看已经匹配多少字符了,终止条件为index=word.length-1
- 遍历搜索第一个字母的位置,确定在第几行,第几列,即
i=?,j=?
- 根据
i
和j
进行递归遍历, 若board[i][j] !== word[index], return false
注意:同一个单元格内的字母不允许被重复利用:所以在搜索的过程中要把已经使用过的字符变为空,即board[i][j]=''
,当四个方向遍历完之后,再恢复
代码实现
/**
* @param {character[][]} board
* @param {string} word
* @return {boolean}
*/
var exist = function(board, word) {
const [m, n] = [board.length, board[0].length];
const dfs = (i, j, index) => {
if (i<0 || i>=m || j <0 || j >=n || board[i][j] !== word[index]) return false; // 边界条件:i和j不能越界 + 字符没匹配上
if (index === word.length-1) return true; // 终止条件:若成立,表示搜索已经完成;
const temp = board[i][j]; // 保存当前字符
board[i][j]=''; // 设置为空
const res = (
dfs(i-1, j, index+1) ||
dfs(i+1, j, index+1) ||
dfs(i, j-1, index+1) ||
dfs(i, j+1, index+1)
);
board[i][j] = temp; // 恢复当前字符
return res;
};
for (let i=0; i<m; i++) {
for (let j=0; j<n; j++) {
if(dfs(i,j,0)) return true;
}
}
return false;
};