算法:单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

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

class Solution {
    // 主方法,接受字符矩阵和目标字符串,返回是否存在目标字符串的布尔值
    public boolean exist(char[][] board, String word) {
        // 获取字符矩阵的行数和列数
        int row = board.length, col = board[0].length;
        // 创建一个与字符矩阵相同大小的二维布尔数组,用于记录每个位置是否被访问过
        boolean[][] visited = new boolean[row][col];
        // 遍历字符矩阵中的每个位置
        for(int i = 0; i < row; i++) {
            for(int j = 0; j < col; j++) {
                // 调用check方法检查当前位置开始是否存在目标字符串
                boolean flag = check(board, visited, i, j, word, 0);
                // 如果存在目标字符串,则返回true
                if(flag) return true;
            }
        }
        // 如果遍历完整个字符矩阵都没有找到目标字符串,则返回false
        return false;
    }

    // 辅助方法,递归检查从给定位置开始是否存在目标字符串
    public boolean check(char[][] board, boolean[][] visited, int i, int j , String word, int k) {
        // 检查是否越界或者当前位置的字符与目标字符串中对应位置的字符不匹配或者已经访问过
        if(i < 0 || i >= board.length || j < 0 || j >= board[0].length || board[i][j] != word.charAt(k) || visited[i][j]) {
            return false;
        }
        // 将当前位置标记为已访问
        visited[i][j] = true;
        // 如果当前检查的字符是目标字符串的最后一个字符,则说明找到了目标字符串
        if(k == word.length() - 1) return true;
        // 初始化结果标志为false
        boolean res = false;
        // 定义四个方向的偏移量:右、左、下、上
        int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
        // 对四个方向进行遍历
        for(int[] dir : directions) {
            // 计算新的位置坐标
            int newi = i + dir[0], newj = j + dir[1];
            // 递归调用check方法,继续向下一个位置搜索
            if(check(board, visited, newi, newj, word, k + 1)) {
                res = true;
                break;
            }
        }
        // 回溯,将当前位置标记为未访问
        visited[i][j] = false;
        // 返回结果标志
        return res; 
    }
}

相关推荐

  1. 算法题】79. 单词搜索

    2024-03-31 18:06:01       40 阅读
  2. 【回溯】79. 单词搜索

    2024-03-31 18:06:01       48 阅读
  3. leetCode79. 单词搜索

    2024-03-31 18:06:01       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-31 18:06:01       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-31 18:06:01       74 阅读
  3. 在Django里面运行非项目文件

    2024-03-31 18:06:01       62 阅读
  4. Python语言-面向对象

    2024-03-31 18:06:01       72 阅读

热门阅读

  1. zookeeper--ACL详解

    2024-03-31 18:06:01       35 阅读
  2. perl:字符串模糊匹配,计算 edit 距离

    2024-03-31 18:06:01       36 阅读
  3. linux 系列文章目录 - 打包压缩命令之tar命令

    2024-03-31 18:06:01       35 阅读
  4. OSPF与静态路由配置实验介绍

    2024-03-31 18:06:01       36 阅读
  5. 二叉树的遍历C语言

    2024-03-31 18:06:01       43 阅读
  6. 【PySide6】PySide6安装及VSCode配置PySide6环境

    2024-03-31 18:06:01       39 阅读
  7. 专升本-物联网

    2024-03-31 18:06:01       33 阅读
  8. linux下I/O多路复用

    2024-03-31 18:06:01       37 阅读
  9. 今天给兄弟姐妹们投喂一些vim的命令组合

    2024-03-31 18:06:01       33 阅读
  10. C++经典面试题目(十三)

    2024-03-31 18:06:01       30 阅读
  11. python学习之-分支结构-入门训练

    2024-03-31 18:06:01       29 阅读
  12. 面试题:Spring Boot Starter的功能与使用场景

    2024-03-31 18:06:01       35 阅读