LeetCode题解No79——“单词搜索”

LeetCode题解

No79

难度:Middle

题目描述:

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

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

示例:

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

给定 word = "ABCCED", 返回 true
给定 word = "SEE", 返回 true
给定 word = "ABCB", 返回 false

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

题目思路

   看到这个题目最开始理解错了题目的意思,理解成了判断char[][] board里面是否存在足够的字符满足word的需求,写了一遍用HashMap存键值对再取出作比较的答案,发现跑不过,看了题解才知道本题是要用DFS,查找char[][] board里是否有那么一条通路,可以组成word。用DFS那套模板就比较简单。首先需要注意,首先是需要一个boolean[][] vis去维护board里的元素有没有被走过,其次是判定递归的结束条件,还有在走不通这个点的时候需要进行回溯处理。在写代码的时候注意这三点即可。

代码执行

public static boolean Solution(char[][] board,String word){
       // 使用DFS来对题目进行求解
       int m = board.length;
       int n = board[0].length;
       boolean[][] vis = new boolean[m][n];
       for (int i = 0; i < m; i++) {
           for (int j = 0; j < n; j++) {
               boolean flag = dfs(board,vis,i,j,0,word);
               if (flag){
                   return true;
               }
           }
       }
       return false;
   }

   /**
    *
    * @param board char[][]矩阵
    * @param vis   用于判断是否走过此元素
    * @param x     新的一个x坐标
    * @param y     新的一个y坐标
    * @param k     Word中第k个元素
    * @param word  需要查找的字符串
    */
   public static boolean dfs(char[][] board,boolean[][] vis,int x,int y, int k,String word){
       // 递归退出条件
       if (board[x][y] != word.charAt(k)){
           return false;
       }else if (k == word.length() - 1){
           return true;
       }
       // 表明当前该元素被走过
       vis[x][y] = true;
       // 搜索方向
       int[][] directions = {{0,1},{1,0},{0,-1},{-1,0}};
       // 结果
       boolean result = false;
       for (int[] dic :
               directions) {
           // 边界判断
           int newX = x + dic[0];
           int newY = y + dic[1];
           if (newX >= 0 && newX < board.length && newY >= 0 && newY < board[0].length){
               if (!vis[newX][newY]){
                   boolean flag = dfs(board,vis,newX,newY,k+1,word);
                   if (flag){
                       result = true;
                       break;
                   }
               }
           }
       }
       // 回溯,所以将vis[x][y]重置为false
       vis[x][y] = false;
       return result;
   }

纠错

1:第一次做题时没有理解清楚题意
2:在写的时候没有注意边界,一直报错

执行结果

原文地址:https://www.cnblogs.com/mlz031702145/p/13661575.html