返回
剑指Offer 79. 单词搜索——JavaScript DFS
前端
2023-11-11 18:53:58
- 前言:
数据结构和算法是计算机科学的重要基石,而深度优先搜索(DFS)算法作为一种经典的搜索算法,在解决各种问题上有着广泛的应用。在本文中,我们将重点关注DFS算法在Leetcode 79. 单词搜索问题中的应用,帮助您理解DFS算法的原理并掌握其用法。
2. Leetcode 79. 单词搜索 问题
Leetcode 79. 单词搜索问题给定一个m×n二维基字符网格board和一个字符串word,要求您判断word是否可以在board中找到。如果word存在于网格中,则返回true;否则,返回false。其中,单词必须按照字母顺序,从一个字母开始,并只能向相邻的字母移动。
3. 解决思路:
DFS算法是一种深度优先搜索算法,它通过不断探索当前节点的相邻节点,并记录访问过的节点,来遍历整个图或树。在Leetcode 79. 单词搜索问题中,我们可以使用DFS算法来判断word是否可以在board中找到。具体思路如下:
- 从board中选择一个字母作为起点。
- 检查该字母是否与word的第一个字母相同。
- 如果相同,则继续从该字母的相邻字母中选择一个字母作为新的起点,并检查该字母是否与word的第二个字母相同。
- 重复步骤2和步骤3,直到找到与word完全相同的路径,或者直到无法找到任何与word相匹配的字母。
- 如果找到与word完全相同的路径,则返回true;否则,返回false。
4. 代码实现:
使用JavaScript实现DFS算法解决Leetcode 79. 单词搜索问题,代码如下:
/**
* 确定单词是否可以在网格中找到
*
* @param {character[][]} board 二维字符网格
* @param {string} word 目标单词
* @return {boolean} 单词是否存在
*/
const exist = (board, word) => {
if (!board || !word) {
return false;
}
// 定义辅助函数来检查单词是否存在于网格中
const dfs = (row, col, index) => {
// 如果超出网格边界或当前字母不匹配,则返回false
if (
row < 0 ||
row >= board.length ||
col < 0 ||
col >= board[0].length ||
board[row][col] !== word[index]
) {
return false;
}
// 如果已经到达单词末尾,则返回true
if (index === word.length - 1) {
return true;
}
// 标记当前字母已被访问
const temp = board[row][col];
board[row][col] = '*';
// 递归检查相邻字母
const found =
dfs(row + 1, col, index + 1) || // 向下搜索
dfs(row - 1, col, index + 1) || // 向上搜索
dfs(row, col + 1, index + 1) || // 向右搜索
dfs(row, col - 1, index + 1); // 向左搜索
// 重置当前字母
board[row][col] = temp;
return found;
};
// 从每个单元格开始搜索单词
for (let i = 0; i < board.length; i++) {
for (let j = 0; j < board[0].length; j++) {
if (board[i][j] === word[0] && dfs(i, j, 0)) {
return true;
}
}
}
return false;
};
5. 总结:
通过本文,您已经了解了如何使用DFS算法解决Leetcode 79. 单词搜索问题。DFS算法是一种强大的搜索算法,它可以用于解决各种各样的问题。掌握DFS算法将使您在解决其他问题时更加得心应手。