返回

剑指Offer 79. 单词搜索——JavaScript DFS

前端

  1. 前言:
    数据结构和算法是计算机科学的重要基石,而深度优先搜索(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中找到。具体思路如下:

  1. 从board中选择一个字母作为起点。
  2. 检查该字母是否与word的第一个字母相同。
  3. 如果相同,则继续从该字母的相邻字母中选择一个字母作为新的起点,并检查该字母是否与word的第二个字母相同。
  4. 重复步骤2和步骤3,直到找到与word完全相同的路径,或者直到无法找到任何与word相匹配的字母。
  5. 如果找到与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算法将使您在解决其他问题时更加得心应手。