矩阵中的路径 AcWing (JAVA)
请设计一个函数,用来判断在一个矩阵中是否存在一条路径包含的字符按访问顺序连在一起恰好为给定字符串。
路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。
如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。
注意:
输入的路径字符串不为空; 所有出现的字符均为大写英文字母;
数据范围 矩阵中元素的总个数 [0,900] 。
路径字符串的总长度 [1,900] 。
样例:
matrix= [
[“A”,“B”,“C”,“E”],
[“S”,“F”,“C”,“S”],
[“A”,“D”,“E”,“E”]
]str=“BCCE” , return “true”
str=“ASAE” , return “false”
解题思路: 本题思路是一个典型的迷宫问题的衍生题。核心思路依旧是 递归与回溯也就是暴力破解法。
(如果对回溯没有概念的话,可以看看这个大哥的视频,讲的是真不错,不懂可以反复观看和模拟:回溯问题)
本题的大致解题过程也很清晰:
1 . 首先从矩阵左上角开始,选一个字母作为路径 起点,判断是否和给定字符串 str 第一个字符一样,如果不一样就在矩阵中按顺序选下一个字符直到一样为止。再对选取字符进行标记: (这需要两个for循环)
2 . 利用递归继续以上一次选取字符位置为起点,进行左右上下探索,如果探索的字符与str的第二个字符一样,那么就对矩阵中此字符标记为已经来过,并以此字符为新起点继续递归探索下面的字符,并以此类推继续执行第 2 步。
(如果左右上下的探索中都没有符合条件的字符,那么就可以结束本次探索,解除对矩阵中上一个字符的标记(回溯)并执行第 1 步开始新的探索。)
解题方式可以用树来操作:

理论成立代码如下(正确代码):
class Solution {public boolean hasPath(char[][] matrix, String str) {for(int i = 0; i < matrix.length; i ++) {for(int j = 0; j < matrix[0].length; j ++) {//按顺序选取起点char a = matrix[i][j];//记录本字符if(dfs(matrix, i, j, 0, str)) return true;//存在一条符合的路径即可退出matrix[i][j] = a;//回溯}}return false;//没有一条符合条件的路径那么返回false}public boolean dfs(char matrix[][], int i, int j, int k, String str) {if(matrix[i][j] != str.charAt(k)) return false;//不相同直接退出if(k == str.length() - 1) return true;//上一个条件说明对应字符相等,此条件判断此字符是否是最后一个字符,是的话直接退出matrix[i][j] = 1;//标记此字符已经访问过,继续下次的探索int fx[] = {0, 0, -1, 1};int fy[] = {-1, 1, 0, 0};//左右上下四个新探索方向int fxx = 0, fyy = 0;for(int z = 0; z < 4; z ++) {fxx = i + fx[z];fyy = j + fy[z];if(fxx >= 0 && fxx < matrix.length && fyy >= 0 && fyy < matrix[0].length && matrix[fxx][fyy] != 1) {//需要判断新方向是否超出矩阵边界,是否已经被访问过,不符合条件则不探索char a = matrix[fxx][fyy];if(dfs(matrix, fxx, fyy, k + 1, str)) return true;//路径存在直接退出返回truematrix[fxx][fyy] = a;//回溯}}return false;//路径不存在,继续找下一个新起点。}
}
***************************************************************************************************************************
进阶:由于最后一个测试点数据庞大,如果在发现路径后,不直接退出,而是对路径回溯的话,那么就会超时。超时代码如下:
import java.util.*;public class Main {public static void main(String[] args) {Solution s = new Solution();char a[][]= {{'A', 'B', 'C', 'E'},{'S', 'F', 'C', 'S'},{'A', 'D', 'E', 'E'},};System.out.println(s.hasPath(a, "BCCE"));//System.out.print();for(int i = 0 ; i < a.length; i ++) {for(int j = 0; j < a[0].length; j ++) {System.out.print(a[i][j] + " ");}System.out.println();}}}
class Solution {public boolean hasPath(char[][] matrix, String str) {if(matrix.length == 0)return false;for(int i = 0; i < matrix.length; i ++) {for(int j = 0; j < matrix[0].length; j ++) {char a = matrix[i][j];if(dfs(matrix, i, j, 0, str)) return true;matrix[i][j] = a;}}return false;}public boolean dfs(char matrix [][],int i, int j, int k, String str) {boolean judge = false;if(k == str.length()) return false;if(str.charAt(k) == matrix [i][j]) {if(k == str.length() - 1 && matrix[i][j] == str.charAt(k)) return true;}elsereturn false;matrix[i][j] = 1;int fx[] = {0, 0, -1, 1};int fy[] = {-1, 1, 0, 0};int fxx = 0; int fyy = 0;for(int x = 0; x < 4; x ++) { fxx = i + fx[x];fyy = j + fy[x];if(fxx >= 0 && fxx < matrix.length && fyy >= 0 && fyy < matrix[0].length && matrix[fxx][fyy] != 1) { char a = matrix[fxx][fyy];if(dfs(matrix , fxx, fyy, k + 1, str)) judge = true;matrix[fxx][fyy] = a;}}return judge;}
}
上述方法运行结果如下:

由于最后一个测试点,数据量庞大,而且找到正确路径后数组的状态对我们来说已经不重要了,所以找到正确路径后跟本没必要回溯。
第一个正确代码运行结果如下所示:

第一个代码在发现有正确路径后直接走人,很潇洒,所以运行时间会比第二个错误代码快,而刚好不会超时。
相关文章:
矩阵中的路径 AcWing (JAVA)
请设计一个函数,用来判断在一个矩阵中是否存在一条路径包含的字符按访问顺序连在一起恰好为给定字符串。 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。 如果一条路径经过…...
使用终端工具给你的电脑发送弹窗提醒
大家好,我是良许。 现在人手一部智能手机,这些智能手机都有个非常实用的功能,那就是弹窗提醒。当我们收到短信,或者微信信息时,手机就会弹窗显示信息的大致内容。有了这个功能你就不会错过重要信息了。 电脑上也有类…...
SpringCloud Alibaba 之Nacos集群部署-高可用保证
文章目录Nacos集群部署Linux部署docker部署(参考待验证)Nacos 集群的工作原理Nacos 集群中 Leader 节点是如何产生的Nacos 节点间的数据同步过程官方推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面。http://nacos.com:port/ope…...
Scala集合详解(第七章:集合、数组、列表、set集合、map集合、元组、队列、并行)(尚硅谷笔记)
集合第七章:集合7.1 集合简介7.1.1 不可变集合继承图7.1.2 可变集合继承图7.2 数组7.2.1 不可变数组7.2.2 可变数组7.2.3 不可变数组与可变数组的转换7.2.4 多维数组7.3 列表 List7.3.1 不可变 List7.3.2 可变 ListBuffer7.4 Set 集合7.4.1 不可变 Set7.4.2 可变 mutable.Set7.…...
定了:Python3.7,今年停止更新~
大家好,这里是程序员晚枫。 今天给大家分享一个来自Python官网的重要消息:Python3.7马上就要停止维护了,请不要使用了! 官网链接:https://devguide.python.org/versions/ 停更的后果是什么? 周末翻阅Py…...
C# 业务单据号生成器(定义规则、获取编号、流水号)
系列文章 C#底层库–数据库访问帮助类(MySQL版) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379 C#底层库–JSON帮助类_详细(序列化、反序列化、list、datatable) 本文链接:htt…...
Java的dump文件分析及JProfiler使用
Java的dump文件分析及JProfiler使用 1 dump文件介绍 从软件开发的角度上,dump文件就是当程序产生异常时,用来记录当时的程序状态信息(例如堆栈的状态),用于程序开发定位问题。 idea配置发生OOM的时候指定路径生成dump文件 # 指定…...
sympy高斯光束模型
文章目录Gauss模型sympy封装实战sympy.phisics.optics.gaussopt集成了高斯光学中的常见对象,包括光线和光学元件等,有了这些东西,就可以制作一个光学仿真系统。Gauss模型 高斯光束的基本模型为 E(r,z)E0ω0ω(z)exp[−r2ω2(z)]exp[−ik…...
Cloudflared 内网穿透 使用记录
Cloudflared 内网穿透前提创建cloudflared tunnel我使用的服务前提 你必须要有一个域名,并且可以改域名的dns解析服务商到cloudflare 1.登录到cloudflare后台,点击添加站点 2.输入自己的域名,下一步选择免费套餐 3.他会搜索这个域名下已有…...
柴油发电机组的调压板
1 概述 柴油发电机组的调压板是一种用于控制发电机输出电压的装置。它通常由一块电子电路板和一个电子电路板上的电位器组成。 当发电机运行时,它会产生电压,然后通过调压板中的电路进行控制。调压板中的电路会检测输出电压的大小,并通过电…...
【MySQL】表操作和库操作
文章目录概念库操作1.创建数据库2.删除数据库3.选择数据库4.显示数据库列表表操作1.创建数据表CREATE2.删除数据表DROP3.插入数据INSERT4.更新数据UPDATE5.修改数据ALTER6.查询数据SELECT7.WHERE子句8.ORDER BY子句9.LIMIT子句10.GROUP BY子句11.HAVING子句使用注意事项概念 M…...
拓扑排序的思想?用代码怎么实现
目录 一、拓扑排序的思想 二、代码实现(C) 代码思想 核心代码 完整代码 一、拓扑排序的思想 以西红柿炒鸡蛋这道菜为例,其中的做饭流程为: 中间2 6 3 7 4的顺序都可以任意调换,但1和5必须在最前面,这是…...
【Git】码云
目录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 6.1 创建远程仓库 6.2 远程仓库操作 6.3 SSH 免密登录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 码云网址: https://githee.com/ 账号验证…...
数据结构与算法(三):栈与队列
上一篇《数据结构与算法(二):线性表》中介绍了数据结构中线性表的两种不同实现——顺序表与链表。这一篇主要介绍线性表中比较特殊的两种数据结构——栈与队列。首先必须明确一点,栈和队列都是线性表,它们中的元素都具…...
Spring架构篇--2.5.2 远程通信基础Select 源码篇--window--sokcet.register
前言:通过Selector.open() 获取到Selector 的选择器后,服务端和客户的socket 都可以通过register 进行socker 的注册; 服务端 ServerSocketChannel 的注册: ServerSocketChannel serverSocketChannel ServerSocketChannel.open(…...
ISIS协议
ISIS协议基础简介应用场景路由计算过程地址结构路由器分类邻居Hello报文邻居关系建立DIS及DIS与DR的类比链路状态信息的载体链路状态信息的交互路由算法网络分层路由域区域间路由简介…...
CRM系统哪种品牌的好?这五款简单好用!
CRM系统哪种品牌的好?这五款简单好用! CRM系统是指利用软件、硬件和网络技术,为企业建立一个客户信息收集、管理、分析和利用的信息系统。CRM系统的基础功能主要包括营销自动化、客户管理、销售管理、客服管理、报表分析等,选择合…...
QT_dbus(ipc进程间通讯)
QT_dbus(ipc进程间通讯) 前言: 参考链接: https://www.cnblogs.com/brt3/p/9614899.html https://blog.csdn.net/weixin_43246170/article/details/120994311 https://blog.csdn.net/kchmmd/article/details/118605315 一个大型项目可能需要多个子程序同…...
华为OD机试 - 数组排序(C++) | 附带编码思路 【2023】
刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…...
字符串转换为二进制-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)
【案例5-4】 字符串转换为二进制 【案例介绍】 1.任务描述 本例要求编写一个程序,从键盘录入一个字符串,将字符串转换为二进制数。在转换时,将字符串中的每个字符单独转换为一个二进制数,将所有二进制数连接起来进行输出。 案…...
吃透Linux/C++系统编程:文件与I/O操作从入门到避坑
合集 - LLM应用实战(17) 1. LLM应用实战:当KBQA集成LLM(二) 2024-04-25 2. LLM应用实战:当KBQA集成LLM 2024-04-11 3. LLM实战:LLM微调加速神器-Unsloth LLama3 2024-05-14 4. LLM实战:LLM微调加速神器-Unsloth Qwen1.5 2024-05…...
8公里巷道,最小误差仅0.6%,天宝耐特携L2pro解锁矿山井下高效安全测量
随着数字矿山建设的加速推进,空间数据采集技术成为矿山数字化转型的重要支撑。在此背景下,天宝耐特在华南某大型金矿完成了灵光L2pro手持SLAM三维激光扫描技术的深度应用实践,以硬核技术破解矿山作业难题,实现井下数字孪生底座构建…...
如何通过有效方法提升儿童专注力障碍的注意力集中度?
提升儿童专注力的有效策略与技巧解析 在帮助儿童提高注意力集中度的过程中,首先需要建立一个适合学习的环境。创造一个安静、整洁的学习空间,减少杂音和干扰,有助于孩子更好地专注。此外,开展一些分段学习的小技巧也是非常有效的方…...
实测才敢推!盘点2026年用户挚爱的AI论文网站
一天写完毕业论文在2026年已不再是天方夜谭。最新实测数据显示,2026年AI论文网站正以惊人的效率重塑学术写作,覆盖选题构思、文献综述、内容生成、格式排版等全流程场景,真正实现高效搞定论文。 一、全流程王者:一站式搞定论文全链…...
数据恢复与Python环境重建指南
数据恢复前的准备工作确认Anaconda安装路径及删除方式(如回收站清理、命令行删除等),避免覆盖原始数据。列出常用存储位置:C:\Users\<用户名>\Anaconda3(Windows)或/home/<用户名>/anaconda3&a…...
OpenClaw 的检索增强中,向量数据库的索引类型(HNSW、IVF)如何选择?
在讨论时序推理时,OpenClaw 对时间关系的建模方式,其实可以从一个很直观的角度去理解——它并不只是简单地给事件贴上时间标签,而是尝试去捕捉事件之间那种动态的、有时甚至是隐含的依赖关系。 想象一下日常生活中整理相册的过程。如果只是按…...
如何用STM32F103C8T6+ESP8266打造低成本智能家居环境监测系统?
基于STM32与ESP8266的智能家居环境监测系统实战指南 1. 项目概述与核心价值 在物联网技术快速普及的今天,智能家居系统正从高端奢侈品转变为大众可负担的实用解决方案。本项目以STM32F103C8T6单片机为核心,搭配ESP8266 WiFi模块,构建了一套…...
Ip2region终极指南:如何快速部署高性能离线IP定位系统
Ip2region终极指南:如何快速部署高性能离线IP定位系统 【免费下载链接】ip2region Ip2region (2.0 - xdb) 是一个离线IP地址管理与定位框架,能够支持数十亿级别的数据段,并实现十微秒级的搜索性能。它为多种编程语言提供了xdb引擎实现。 项…...
深入拆解AM信号模拟:从AD9959 DDS配置到AD835乘法器调制的硬件设计细节
深入拆解AM信号模拟:从AD9959 DDS配置到AD835乘法器调制的硬件设计细节 在射频电路设计中,AM信号模拟系统是检验工程师硬件功底的最佳试金石。全国大学生电子设计大赛C题的经典命题,不仅考察对调幅原理的理解,更要求选手在30-40MH…...
TranslateGemma避坑指南:解决CUDA报错和GPU识别问题
TranslateGemma避坑指南:解决CUDA报错和GPU识别问题 1. 常见问题概述:为什么你的GPU跑不起来 部署TranslateGemma时,90%的安装失败都与GPU相关。以下是工程师们最常遇到的三大问题: CUDA版本不匹配:系统CUDA与镜像要…...
