题目简述:在给定的字母矩阵之中找到连续的word。
其实这一题跟岛屿的题目很像,都是四个方向上去探寻。岛屿的操作就是要给岛屿淹没,这一题的操作就需要标记已经使用过的字母,如果不满足条件,然后再进行回溯。
跟所有回溯的写法相同,在递归调用的前面进行操作,后面进行复原操作,只不过这里的递归的操作就是4个操作了。
如果可以重复使用字母,可以去掉做标记的代码(11、13、19行代码)即可
var exist = function (board, word) {
let row = board.length
let col = board[0].length
var dfs = function (i, j, index) {
// 遍历到最后一个字母,找到满足条件的
if (index === word.length) return true
// 越界
if (i < 0 || i >= row || j < 0 || j >= col) return false
// 当前字母不匹配
if (board[i][j] !== word[index]) return false
let tmp = board[i][j]
// 给字母打标记,表示已经用过
board[i][j] = '#'
let found = 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] = tmp
return found
}
for (let i = 0; i < row; ++i) {
for (let j = 0; j < col; ++j) {
// 满足首个字母相同,则进入dfs进行四个方向上的递归
if (board[i][j] === word[0]) {
// 递归条件满足,return true
if (dfs(i, j, 0)) {
return true
}
}
}
}
return false
};
如果要记录路径,就直接在递归的前后进行记录还有复原即可
var exist = function(board, word) {
let row = board.length;
let col = board[0].length;
let path = []; // 用于记录路径
// DFS辅助函数
var dfs = function(i, j, index) {
if (index === word.length) return true; // 找到单词
if (i < 0 || i >= row || j < 0 || j >= col || board[i][j] !== word[index]) return false; // 越界或字符不匹配
// 保存当前字符并标记为已访问
let temp = board[i][j];
board[i][j] = '#';
path.push([i, j]); // 记录当前路径
// 继续搜索相邻的四个方向
let found = dfs(i - 1, j, index + 1) ||
dfs(i + 1, j, index + 1) ||
dfs(i, j - 1, index + 1) ||
dfs(i, j + 1, index + 1);
// 如果找不到,移除当前路径
if (!found) path.pop();
// 恢复当前字符
board[i][j] = temp;
return found;
};
// 遍历网格中的每个位置
for (let i = 0; i < row; ++i) {
for (let j = 0; j < col; ++j) {
if (board[i][j] === word[0] && dfs(i, j, 0)) {
console.log("Path: ", path); // 输出路径
return true;
}
}
}
return false;
};