牛客剑指offer之【JZ12 矩阵中的路径】

2023-11-15

哈喽,这次真的是好久不见呀,我回来啦~~接下来的日子我会不断更新牛客上的剑指offer题解,为什么这么做呢?是因为博主刷题总是刷了忘忘了刷,一样的题目换种形式就要做好久,说到底还是对知识点的理解不够透彻,加之算法对一个即将找工作的大学生来说更是重中之重。所以以后我将以写博客的方式来记录我的解题过程,这样既可以做到一个题后总结的作用,又可以起到一个隐形督促作用~~那废话不多说,我们直接开始吧~~

 1.题目

2.示例解读

示例1中给了一个二维数组和一个字符串,要让我们判断,在矩阵中是否存在这样一条路径能与给出的字符串匹配。很显然是存在的,如下图:

但是这条路径是怎样找到的呢?其实很简单,因为路径的起点是可以任意的,所以我们需要遍历这个矩阵中的每一个元素。如果其中以任意一个元素为起点的路径可以与字符串匹配,我们就认为在这个矩阵中是存在这样的一条路径的,反之则不存在。对于路径所到达的最后一个元素,我们需要对它的上下左右每一个方向去依次试探,找到与之匹配的下一个节点,直到匹配完字符串中的所有字符或每一个方向都不能与之匹配位置为止,如下图:

3.解题思路

通过以上分析,我们不难发现这就是一个很典型的回溯问题,就是通过枚举的方式去一个个往下去试探。因为起点可以是矩阵中的任意一个元素,所以我们要对这个二维数组进行遍历。大致如下:

for(int i=0;i<matrix.length;i++){
    for(int j=0;j<matrix[0].length;j++){
        //从matrix[i][j]开始查找
        if(dfs(matrix,i,j,0,word))
            return true;
    }
}       
return false;   

 这里关键就是dfs这个函数的实现,因为每一个点我们在查找的时候可以分上下左右四个方向,其中要排除该路径已经经过的节点,即节点不能被二次匹配。所以我们需要将被匹配到的节点标记一下,以防被再次匹配。大致代码如下:

boolean dfs(char[][] matrix,int x,int y,int n,String word){
        //递归出口
        if(n==word.length())return true;
        if(x<0||y<0||x>=matrix.length||y>=matrix[0].length
        ||matrix[x][y]!=word.charAt(n))return false;

        //代码走到这里说明matrix[x][y]能与之匹配,然后去搜索matrix[x][y]的上下左右节点
        boolean res=false;
        //记录被匹配到的值
        char tmp=matrix[x][y];
        //修改匹配的值,使之永远不会被匹配到(即不存在二次匹配)
        matrix[x][y]='0';

        //上下左右依次搜索
        res=dfs(matrix,x-1,y,n+1,word)||dfs(matrix,x+1,y,n+1,word)||
        dfs(matrix,x,y-1,n+1,word)||dfs(matrix,x,y+1,n+1,word);
        //结束一轮搜索之后回到上一个节点
        matrix[x][y]=tmp;
        return res;
}

4.完整代码

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param matrix char字符型二维数组 
     * @param word string字符串 
     * @return bool布尔型
     */
    public boolean hasPath (char[][] matrix, String word) {
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[0].length;j++){
               if(dfs(matrix,i,j,0,word))return true;
            }
        }       
        return false;      
    }
    boolean dfs(char[][] matrix,int x,int y,int n,String word){
        if(n==word.length())return true;
        if(x<0||y<0||x>=matrix.length||y>=matrix[0].length
        ||matrix[x][y]!=word.charAt(n))return false;
        boolean res=false;
        char tmp=matrix[x][y];
        matrix[x][y]='0';
        //上下左右
        res=dfs(matrix,x-1,y,n+1,word)||dfs(matrix,x+1,y,n+1,word)||
        dfs(matrix,x,y-1,n+1,word)||dfs(matrix,x,y+1,n+1,word);
        matrix[x][y]=tmp;
        return res;
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

牛客剑指offer之【JZ12 矩阵中的路径】 的相关文章

随机推荐

  • Kotlin 1.2 新特性

    点击关注异步图书 置顶公众号 每天与你分享IT好书 技术干货 职场知识 在Kotlin 1 1中 团队正式发布了JavaScript目标 允许开发者将Kotlin代码编译为JS并在浏览器中运行 在Kotlin 1 2中 团队增加了在JVM和
  • Intellij Idea怎么撤销,反撤销

    Intellij IDEA中 1 Ctrl z是撤销快捷键 2 反撤销快捷键为 Ctrl Shift Z
  • React 配置路由

    1 在 index 中引入 App 文件 index 是入口文件 并且在 index 中引入样式文件等等 把 App 挂载到 DOM 元素上 2 在 App 组件中
  • 3 亿岗位将被 AI 取代?巴比特深度采访业界后,“失业潮”真相有些出人意料……...

    图片来源 由无界 AI工具生成 人工智能技术的发展正迎来奇点 尤其是今年以来 ChatGPT 和 AIGC 的迅猛势头让无数人猝不及防 真真切切地对各行各业现有的工作岗位产生冲击 近日 蓝色光标全面停止创意设计 方案撰写 文案撰写 短期雇员
  • (简单成功版本)Mysql配置my.ini文件

    目录 一 背景 二 删除原有的mysql服务 三 初始化mysql 四 自行添加my ini文件 五 新建mysql服务 六 启动mysql服务 七 设置数据库密码 7 1 登录mysql数据库 7 2 修改root用户密码 八 配置my
  • Xcode编译报错不提示

    M1 Xcode Version 12 5 1 12E507 编译项目之后提示 Build Failed 但是并不报 小红点 不指示是哪个文件报错 不知道去哪里找报错文件了 Xocode 工具栏上有这个按钮 选择之后点击某次编译 如果有错误
  • DOTA目标检测数据集

    Dota开源目标检测数据集 DOTA v1 5包含16个类别中的40万个带注释的对象实例 这是DOTA v1 0的更新版本 它们都使用相同的航拍图像 但是DOTA v1 5修改并更新了对象的注释 其中许多在DOTA v1 0中丢失的10像素
  • 拷贝构造函数的调用方式以及相关问题【最清晰易懂】

    这几天一直有一个问题在我大脑里挥之不去 之前面试实习的时候也被问过 但是回答的不好 面试官问 你知道的构造函数有哪些 我说 无参构造函数 有参构造函数 拷贝构造函数 移动构造函数 关于一些函数的说明 面试官说 其实拷贝构造函数 移动构造函数
  • java给字符串数组追加字符串_java往字符串数组追加新数据

    public class Test public static void main String args 原字符串数组 String arr 原字符串数据1 原字符串数据2 执行数据添加 arr insert arr 需要追加的字符串数据
  • win11安装mysql5.7带安装包与常见问题如重装,初次登录不上,跳不了密码等

    目录 1下载 2安装 注意1 你的新建只有文件夹而且需要权限 注意2报错The service already existsThe current server installed 3初次登录与密码 注意3密码是只能输入进去的 4设置密码与
  • OpenCV总结3——图像拼接Stitching

    之前折腾过一段时间配准发现自己写的一点都不准 最近需要进行图像的拼接 偶然的机会查到了opencv原来有拼接的库 发现opencv处理配准之外还做了许多的操作 就这个机会查找了相关的资料 同时也研究了以下他的源代码 做一个简单的总结 Sti
  • css实现表单验证

    在我们的日常业务中 表单验证是个很常见设计需求 像一些登录注册框 问卷调查也都需要用到表单验证 一般我们的实现思路都是JS监听input框的输入内容 判断用户输入内容 从而以此来决定下一步的操作
  • 13.6 Production State Awareness (PSA)

    1 Introduction UFS设备可以利用有关其生产状态的知识 相应地调整内部操作 例如 在设备焊接之前加载到存储设备中的内容可能被破坏 其概率高于regular模式 UFS设备可以在设备焊接前使用 Special 内部操作加载内容
  • qt界面论坛

    http www cnblogs com appsucc archive 2012 03 14 2395657 html
  • JAVA核心知识点--Maven引入org.apache.tools.zip

    可以看出 org apache tools zip 是 ant jar里面的 所以要引入org apache tools zip 直接maven引入ant即可
  • 基于SSM框架的家教中介平台系统的设计与实现(源码免费获取)

    技术架构 Java语言 MySQL数据库 SSM框架 功能简介 1 系统登录 系统登录成为了管理员访问系统的路口 设计了系统登录界面 包括管理员名 密码和验证码 然后对登录进来的管理员判断身份信息 判断其为管理员 还是普通用户 2 管理员管
  • logback 对特殊日志进行过滤

    工作中需要对 logback 的日志进行定制化过滤 此时一般有两种方法 logger 在 logback spring xml 中添加如下配置 可以关闭对应类的日志
  • Intellij安装scala插件详解

    参考博客 1 http wwwlouxuemingcom blog 163 com blog static 20974782201321953144457 2 http blog csdn net stark summer article
  • cvm云服务器的,cvm云服务器如何登录

    cvm 登录到 本地为 Windows 计算机 1 在本地 Windows 机器上 单击开始菜单 运行 输入 mstsc 命令 即可打开远程桌面连接对话框 2 在输入框输入 Windows 服务器的公网 IP 登录 云服务器控制台 可查看云
  • 牛客剑指offer之【JZ12 矩阵中的路径】

    哈喽 这次真的是好久不见呀 我回来啦 接下来的日子我会不断更新牛客上的剑指offer题解 为什么这么做呢 是因为博主刷题总是刷了忘忘了刷 一样的题目换种形式就要做好久 说到底还是对知识点的理解不够透彻 加之算法对一个即将找工作的大学生来说更