DFS深度优先搜索——LeetCode79. 单词搜索

Posted guomzh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DFS深度优先搜索——LeetCode79. 单词搜索相关的知识,希望对你有一定的参考价值。

题目:

给定一个二维网格和一个单词,找出该单词是否存在于网格中。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

示例:

board =
[
['A','B','C','E'],
['S','F','C','S'],
['A','D','E','E']
]

给定 word = "ABCCED", 返回 true.
给定 word = "SEE", 返回 true.
给定 word = "ABCB", 返回 false.
思路:

这是一道典型的dfs深搜题目,选定一个点,不断第深搜深度depth+1,知道得出结果就行了。步骤:

①把二维网格中的每一个点当作起点,进行dfs,如果结果为true直接返回,没有就继续把下一个点当为起点。

②深度优先搜索关键是: 递归 -> 判断是否为边界条件(递归结束情况) -> 遍历每种情况深度depth+1 -> 回溯

解答代码:
class Solution {
  public boolean exist(char[][] board, String word) {
      for(int i = 0; i < board.length; i++){
          for(int j = 0; j < board[0].length; j++){
              if(dfs(board, word, 0, i, j)){
                  return true;
              }
          }
      }
      return false;
  }
  public boolean dfs(char[][] board, String word, int index, int x, int y){
      if(index == word.length()){
          return true;
      }
      if(x < 0 || y < 0 || x == board.length || y == board[0].length){
          return false;
      }
      char current = word.charAt(index);
      if(board[x][y] != current){
          return false;
      }
      //标记为已经遍历过
      board[x][y] = '\0';
      boolean result = dfs(board, word, index+1, x, y+1)
          || dfs(board, word, index+1, x, y-1)
          || dfs(board, word, index+1, x-1, y)
          || dfs(board, word, index+1, x+1, y);
      //回溯
      board[x][y] = current;
      return result;
  }
}


以上是关于DFS深度优先搜索——LeetCode79. 单词搜索的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-79-单词搜索(用dfs解决)

LeetCode79 单词搜索(dfs)

LeetCode 988:回溯和深度优先搜索(DFS)的区别

Leetcode之深度优先搜索(DFS)专题-733. 图像渲染(Flood Fill)

Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles)

Leetcode之深度优先搜索(DFS)专题-DFS+记忆化 329. 矩阵中的最长递增路径(Longest Increasing Path in a Matrix)