【剑指offer】10. 矩阵中的路径(java)

news2024/11/15 17:26:39

文章目录

  • 矩阵中的路径
    • 描述
    • 示例1
    • 示例2
    • 思路
    • 完整代码

矩阵中的路径

描述

请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
[ a b c e s f c s a d e e ] [a\quad b \quad c \quad e\quad \\ s\quad f\quad c\quad s\quad \\a\quad d\quad e\quad e\quad ] [abcesfcsadee]
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

数据范围: 0 ≤ n , m ≤ 20 0≤n,m≤20 0n,m20, 1 ≤ l e n ≤ 25 1≤len≤25 1len25

示例1

输入:

[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcced"

返回值:

true

示例2

输入:

[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcb"

返回值:

false

思路

看到题目第一眼想到的方法是动态规划法,但是尝试了一下发现写不出来,看了下别人的解法发现基本都是用递归和回溯法。

首先要弄清楚题目有两个要求:

  • 在矩阵中找到一条包含字符串所有字符的路径
  • 路径不能经过已经访问过的字符

基本思路就是:对于题目给出的字符串,从矩阵的左上角元素开始,如果成功匹配字符串的首元素,则从左上角元素的周围元素继续递归,一般情况下有上下左右四种邻居。如果一个邻居元素不能匹配字符串的对应位置的元素,则应该回溯到父节点,接着递归父节点的其他邻居,如果父节点的所有邻居都没有匹配的,则说明路径不存在,返回false

下面考虑终止条件

  • 当邻居元素超过矩阵边界时需要终止返回
  • 当邻居元素与需要匹配的字符不同时终止
  • 当前邻居元素已经在访问路径中时需要终止

具体步骤如下:

  1. 首先判断空矩阵空字符串的情况,此时直接返回false
  2. 用一个access数组来记录当前字符串是否在访问路径
  3. 接着从矩阵的左上角开始遍历每一个元素
  4. 如果当前元素的邻居元素到达终止条件则返回
  5. 如果最后找到这条路径则返回true

借用别人的图基本思路就像下面这样

图片说明

完整代码

import java.util.*;


public class Solution {
    private boolean dfs(char[][] matrix, int n, int m, int i, int j, String word,
                        int index, boolean[][] access) {
        if (i < 0 || i >= n || j < 0 || j >= m ||
                (matrix[i][j] != word.charAt(index)) || (access[i][j] == true)) {
            return false;
        }
        //index记录当前第几个字符
        if (index == word.length() - 1) {
            return true;
        }
        access[i][j] = true;
        if (dfs(matrix, n, m, i - 1, j, word, index + 1, access)
                || dfs(matrix, n, m, i + 1, j, word, index + 1, access)
                || dfs(matrix, n, m, i, j - 1, word, index + 1, access)
                || dfs(matrix, n, m, i, j + 1, word, index + 1, access)) {
            return true;
        }
        access[i][j] = false;
        return false;
    }
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param matrix char字符型二维数组
     * @param word string字符串
     * @return bool布尔型
     */
    public boolean hasPath (char[][] matrix, String word) {
        // write code here
        if (matrix.length == 0 || word.length() == 0) {
            return false;
        }
        int n = matrix.length;
        int m = matrix[0].length;
        boolean[][] access = new boolean[n][m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (dfs(matrix, n, m, i, j, word, 0, access)) {
                    return true;
                }
            }
        }
        return false;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot切面应用

1、切面场景 无侵入的实现功能增强 2、实现 切面类的实现 需要使用注解Aspect和Componet来实现&#xff0c; 环绕通知的作用在返回的student的sname后面拼接around字符串。 后置通知的作用在入参后面拼接idididdi&#xff0c;然后打印日志 Aspect Component public class…

English Learning - L3 纠音 W9 Lesson7-8 Ted Living Beyond Limits 2023.7.4 周二

朗读内容&#xff1a; Lesson 7-8 Day 52 - 60 句子 Ted Living Beyond Limits 23-50

使用Python爬虫和数据可视化,揭示人口大国历年人数的变迁

前言 人口大国通常在全球人口排名中位居前列&#xff0c;其人口数量远远超过其他国家。而印度和中国这两个国家的人口数量均已经超过14亿&#xff0c;而当前全球的人口总数也不过刚刚突破80亿而已&#xff0c;妥妥的天花板级别存在。或许是中国和印度在人口方面的表现太过“耀…

【CANopen】周立功轻松入门CANopen笔记

前言 想学习些新东西了&#xff0c;原本想直接学学Ethercat&#xff0c;但是简单看了看对象字典啥的概念一头雾水的&#xff0c;决定先从CANopen开始&#xff0c;Ethercat看着头疼。Etehrcat和CANopen有挺多类似的地方。感谢ZLG的这个入门笔记&#xff0c;我似乎是看懂了些&am…

非主流币波段策略

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

数据合并--Pandas

1. 键匹配合并:merge()函数 1.1 函数功能 合并DataFrame或者命名的Series&#xff0c;命名的Series被视为单列的DataFrame 1.2 函数语法 pandas.merge(left, right, howinner, onNone, left_onNone, right_onNone, left_indexFalse, right_indexFalse, sortFalse, suffixes…

最长公共子序列LCA

最长连续公共子序列 题目链接:3692. 最长连续公共子序列 - AcWing题库 /*解法:定义dp[i1][j1]为以a[i]结尾的字符串和b[j]结尾的字符串的最长连续公共子序列那么对于a[i] b[j]的时候 dp[i1][j1] dp[i][j]1否则为0 其他就是细枝末节 */ #include<iostream> #include<…

【shiro】springboot整合shiro

springboot整合shiro&#xff0c;实现用户登录认证&#xff0c;权限校验及rememberMe 1.数据库准备 user 用户表 CREATE TABLE user (id bigint NOT NULL,name varchar(30) DEFAULT NULL,pwd varchar(35) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,ri…

《Java核心技术大会2023》——AIC送书第一期

共同深入探讨 Java 生态&#xff01;直播预约&#xff1a;视频号“IT阅读排行榜” 大会简介 人工智能在22年、23年的再次爆发让Python成为编程语言里最大的赢家&#xff1b;云原生的持续普及令Go、Rust等新生的语言有了进一步叫板传统技术体系的资本与底气。我们必须承认在近…

smale周报

2023.7.7 相关工作近况存在的问题展望 相关工作近况 近期仍就进行3D断层识别实验&#xff0c;实验了很多版本&#xff0c;不同的损失函数和模型&#xff0c;发现当下的效果更好。之前loss一直不正常&#xff0c;改变了之前的一些小问题&#xff0c;使模型和损失函数以及数据匹…

具备捕获 Web2 用户能力的 PoseiSwap,治理通证$POSE再度涨超 360%

Nautilus Chain 是行业内首个模块化 Layer3 架构链&#xff0c;开发者能够基于模块化进行定制化开发&#xff0c;并有望进一步推动 Web3 应用向隐私、合规等方向发展。当然&#xff0c;Nautilus Chain 的特殊之处还在于为生态用户带来丰厚的空投预期&#xff0c;据悉上线 Nauti…

Ubuntu 的移动梦醒了

老实讲&#xff0c;移动版 Ubuntu 在手机、平板上的发展自始至终可能都没有达到过 Canonical 的期望&#xff0c;既然如此&#xff0c;不再勉为其难地坚持下去&#xff0c;或许才是更加明智的做法。 时至今日&#xff0c;官方显然也意识到了这一点&#xff0c;在早些时候发布的…

EPSON机械臂控制记录

我使用的机器人型号为EPSON LS3-4013&#xff0c;在本文中记录了机械臂控制器和电脑连接&#xff0c;及电脑程序控制机械臂的完整流程。 1 USB连接电脑和机械臂 将USB连接电脑和控制器的PC插口。在EPSON RC 软件中选择 设置->电脑和控制器通信。其中默认包括USB通信&#…

标签平滑知识点

一、什么是标签平滑 标签平滑&#xff08;Label smoothing&#xff09;&#xff0c;像L1、L2和dropout一样&#xff0c;是机器学习领域的一种正则化方法&#xff0c;通常用于分类问题&#xff0c;目的是防止模型在训练时过于自信地预测标签&#xff0c;改善泛化能力差的问题。…

OK Print Watch 打印服务监控软件---Crack

O&K Print Watch 是一个服务器端打印监视器。此打印审核工具允许用户控制打印作业、纸张使用情况&#xff0c;并从打印服务器、本地、共享或网络打印机收集统计信息。使用O&K Print Watch&#xff0c;您可以根据许多不同的打印限制为用户定义打印配额。这些功能使用户能…

在Oracle VM VirtualBox 安装ubuntu-22.04.2 后打不开终端处理

1、下载ubuntu-22.04.2-desktop-amd64.iso 下载地址&#xff1a; https://cn.ubuntu.com/download/desktop2、安装 3、直接下一步即可 3、装好系统&#xff0c;发现打不开终端 解决办法&#xff1a;设置->区域与语言 查看语言和格式是否一致&#xff0c;不一致需修改。若…

sqlserver数据库命令行客户端安装

项目情况 项目上需要通过执行sql语句去更新一些功能 直接进入数据库去进行执行太麻烦&#xff0c; 对基础技术人员的要求比较高&#xff0c;执行效率低 参考资料 sqlcmd 实用工具 - SQL Server | Microsoft Learn 下载 ODBC Driver for SQL Server - ODBC Driver for SQL S…

感知机模型

1. 提出问题 问题&#xff1a;有一组训练数据集 T { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } T\{(x_1,y_1), (x_2,y_2), \ldots ,(x_N,y_N)\} T{(x1​,y1​),(x2​,y2​),…,(xN​,yN​)} 其中 x i ∈ X R n x_i\in\mathcal{X}R^n xi​∈XRn&#xff0c; y …

Redis【实战篇】---- UV统计

Redis【实战篇】---- UV统计 1. UV统计 - HyperLogLog2. UV统计 - 测试百万数据的统计 1. UV统计 - HyperLogLog 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内…

Linux信号机制

转自&#xff1a;深入理解Linux信号机制(1.0)_城中之城的博客-CSDN博客 一、信号机制概览 相信大家对信号并不陌生&#xff0c;很多人都用过kill命令或者CtrlC组合键杀死过进程&#xff0c;或者遇到过程序因为收到SIGSEGV信号而崩溃的。而对信号的基本原理&#xff0c;估计很…