AC 剑指 Offer 12. 矩阵中的路径

简介: AC 剑指 Offer 12. 矩阵中的路径

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

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

例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。
在这里插入图片描述

示例 1:

输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
输出:true
示例 2:

输入:board = [["a","b"],["c","d"]], word = "abcd"
输出:false

提示:
1 <= board.length <= 200
1 <= board[i].length <= 200
board 和 word 仅由大小写英文字母组成

class Solution {
    /**
     * @Title: exist
     * @Description: DFS,遍历二维数组,按序查找
     * @author: itbird
     * @date 2022年3月16日 上午11:04:47
     * @param board
     * @param word
     * @return boolean 时间复杂度: O(3的k次方 * MN) 空间复杂度: O(MN)
     */
    // 是否已找到,用于DFS过程中剪枝
    private boolean flag;

    public boolean exist(char[][] board, String word) {
        if (word == null || word.length() == 0) {
            return true;
        }
        // 获取匹配字符串的字符串数组
        char[] words = word.toCharArray();
        // 获取二维数组的m、n
        int m = board.length;
        int n = board[0].length;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (flag) {
                    break;
                }

                dfs(board, words, i, j, m, n, 0);
            }
        }
        return flag;
    }

    /**
     * @Title: dfs
     * @Description:
     * @author: itbird
     * @date 2022年3月16日 上午11:32:52
     * @param board
     *            查找的二维数组
     * @param word
     *            匹配的字符串
     * @param i
     *            当前遍历二维数组的起点坐标
     * @param j
     *            当前遍历二维数组的起点坐标
     * @param m
     *            二维数组的行数
     * @param n
     *            二维数组的列数
     * @param k当前匹配字符串遍历到哪个位置,如果遍历到word.length-1,则认为已找到字符串
     */
    private void dfs(char[][] board, char[] word, int i, int j, int m, int n,
            int k) {
        if (flag) {
            // 已匹配到,则不再遍历
            return;
        }

        if (i<0||j<0||i >= m || j >= n || board[i][j] != word[k]) {
            // 如果遍历到边界或者当前不相等,则回退
            return;
        }

        if (word.length - 1 == k) {
            flag = true;            
            return;
        }

        // 保留当前位置字符
        char c = board[i][j];
        // 标记当前位置已遍历
        board[i][j] = '*';
        // dfs遍历上、右、下、左
        dfs(board, word, i - 1, j, m, n, k + 1);
        dfs(board, word, i, j + 1, m, n, k + 1);
        dfs(board, word, i + 1, j, m, n, k + 1);
        dfs(board, word, i, j - 1, m, n, k + 1);
        //恢复board[i][j]
        board[i][j] = c;
    }

}
目录
相关文章
|
运维 监控 安全
云计算MSP行业调研报告
# 1. 概述 ## 1.1 背景和概念 企业上云是当前的大势所趋,但企业上云并非坦途。随着业务、数据等向云端迁移,企业在上云过程中会各种复杂的问题,比如平台选择、系统迁移、多云管理、应用优化以及成本核算和安全管理等问题。要解决这些问题,就需要专业的团队来指导,因此诞生了云MSP。 云MSP即云管理服务提供商(Cloud Management Service Provider),通常是指对接
4656 0
云计算MSP行业调研报告
|
搜索推荐 机器学习/深度学习 算法
如何增加用户的参与感?交互式推荐来了!
一方面,互动能让用户感受到更多的参与感,并能一定程度上干预推荐结果,而不只是被动接受推荐结果;另一方面,系统通过与用户的互动能更加了解用户的偏好,从而提升推荐效果。那么,我们是如何让用户和推荐系统互动起来的呢?且看下文。
4667 0
|
11月前
|
运维 监控 负载均衡
探索微服务架构下的服务治理:动态服务管理平台深度解析
探索微服务架构下的服务治理:动态服务管理平台深度解析
|
10月前
|
弹性计算 Java 数据库
Web应用上云经典架构实战
本课程详细介绍了Web应用上云的经典架构实战,涵盖前期准备、配置ALB、创建服务器组和监听、验证ECS公网能力、环境配置(JDK、Maven、Node、Git)、下载并运行若依框架、操作第二台ECS以及验证高可用性。通过具体步骤和命令,帮助学员快速掌握云上部署的全流程。
221 1
|
9月前
|
数据采集 供应链 安全
中小企业数改方案
本方案旨在推动中小企业数字化转型,落实国家四部门发布的《中小企业数字化赋能专项行动方案(2025—2027年)》。通过政策引导、技术支持和应用实践,帮助中小企业降低转型成本,提升核心竞争力,实现从营销管理、生产管控、质量管理到设备管理等多场景的全面数字化升级。
358 2
中小企业数改方案
|
应用服务中间件 nginx 开发者
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
最近一段时间 Docker 镜像一直是 Pull 不下来的状态,感觉除了挂🪜,想直连 Docker Hub 是几乎不可能的。更糟糕的是,很多原本可靠的国内镜像站,例如一些大厂和高校运营的,也陆续关停了,这对我们这些个人开发者和中小企业来说是挺难受的。之前,通过这些镜像站,我们可以快速、方便地获取所需的 Docker 镜像,现在这条路也不行了。感觉这次动作不小,以后想直接访问 Docker Hub 是不可能了。所以我们得想办法搭建自己的私有镜像仓库。
从 Docker Hub 拉取镜像受阻?这些解决方案帮你轻松应对
|
移动开发 API 开发工具
uniapp如何与原生应用进行混合开发?
uniapp如何与原生应用进行混合开发?
913 0
Axure原型设计:制作验证码倒计时,并重新获取交互效果
本文详细介绍了在Axure中实现验证码倒计时交互效果的步骤,包括元件准备、布局美化、全局变量设置及交互效果配置。通过分解交互流程,利用全局变量控制倒计时逻辑,最终实现按钮从“获取验证码”到倒计时状态的自动切换,并可重复使用。
358 1
|
关系型数据库 MySQL 数据处理
Mysql关于同时使用Group by和Order by问题
总的来说,`GROUP BY`和 `ORDER BY`的合理使用和优化,可以在满足数据处理需求的同时,保证查询的性能。在实际应用中,应根据数据的特性和查询需求,合理设计索引和查询结构,以实现高效的数据处理。
1273 1
|
算法 Python
打造高效生产排程:Python在APS解决方案中的应用
打造高效生产排程:Python在APS解决方案中的应用
684 2