[79]单词搜索
题目地址:https://leetcode.cn/problems/word-search/?favorite=2cktkvj
思路分析:
/**
* @param {character[][]} board
* @param {string} word
* @return {boolean}
递归+回溯
*/
var exist = function(board, word) {
const m = board.length;
const n = board[0].length;
// 当前元素有没有作为路径中(正确路径)的一环被使用
const used = new Array(m).fill(false).map(() => new Array(n).fill(false));
// 递归函数: row, col, k:当前元素所在位置,以及要寻找的字符串的目标位置
const canFind = (row, col, k) => {
// 递归终止条件
//(2)目标字符串被全部找到了
if(k === word.length) {
return true;
}
//(3)当前元素越界啦
if(row < 0 || row >= m || col < 0 || col >= n) {
return false;
}
//(1)当前元素不是字符串路径中的元素, 当前点已经被使用过
if(used[row][col] || board[row][col] !== word[k]) {
return false;
}
// 说明当前元素没有越界,路径未全部找出,当前元素也是路径中的一个,可以被使用,作为路径中的一环。
used[row][col] = true; // 当前元素被使用,并以该元素,进行查找判断是不是在正确路径上。
// 通过判断该元素上下左右是否也有在路径上的元素能被找到
let correctPath = canFind(row + 1, col, k+1)
|| canFind(row - 1, col, k+1)
|| canFind(row, col + 1, k+1)
|| canFind(row, col - 1, k+1);
if(correctPath) {
return true;
}
// 上下左右没有路径上的元素被找到,说明该元素虽然是路径上出现的元素,但不是正确路径上可以被使用的元素,所以需要将该元素被使用状态置未false:没有被正确路径所使用
used[row][col] = false;
return false;
}
// 外层遍历
for(let i = 0; i < m; i++) {
for(let j = 0; j < n; j++) {
// 找到目标字符串中第一个元素,以该元素为路径起点进行查找。
if(board[i][j] === word[0] && canFind(i, j, 0)) {
return true;
}
}
}
return false;
};