剑指offer第10题:矩阵中的路径
时间:2022-07-22
本文章向大家介绍剑指offer第10题:矩阵中的路径,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
矩阵中的路径
剑指Offer 12:矩阵中的路径【中等题】”
题目描述
方法:回溯
根据题目要求,需要我们从一个已知矩阵中找到一个可以挨个形成给定字符串的路径。如果有这条路径的话,我们需要返回true
,如果没有的话,我们返回false
,并且相同的字符不能重复使用。
从题目的解析上,我们可以很自然的联想到遍历整个矩阵,只是在遍历整个矩阵时,我们还需要保证每一次使用的元素不能重复,此时我们可以联想到回溯算法。
首先我们需要建立一个访问矩阵vis
,遍历整个矩阵,找到字符串的第一个字符,这个位置将会被我们用来作为开始的位置。然后以此处为中心,开始向四周进行扩展遍历,查看扩展中的路径,能否有一条到达字符串最后字符的路径,如果有的话,我们便找到了我们需要的这个字符串路径。对于每次我们遍历过的字符,需要将其位置设为true
,表示当前位置已经被访问过了,然后再继续遍历下一个字符,向下递归。
使用回溯算法的时候,我们需要弄清楚一个问题,什么时候开始回溯?如果当前矩阵字符和字符串字符不匹配,那我们可以直接结束遍历,返回false
即可;只有在当前字符匹配成功,但是后续的字符匹配不成功的时候,我们才需要把已经匹配的字符的vis
进行回溯。
代码实现
private boolean[][] vis;//存放访问过的节点
private int row ;
private int col ;
public boolean exist(char[][] board, String word) {
if(board == null || board.length == 0 || word == null) return false;
row = board.length;
col = board[0].length;
vis = new boolean[row][col];
for(int i = 0 ; i < row ; i ++){
for(int j = 0 ; j < col ; j++){
if(board[i][j] == word.charAt(0)){//寻找第一个符合的节点
boolean ans = help(board ,word , i , j , 0);
if(ans) return true;
}
}
}
return false;
}
private boolean help(char[][] board , String word , int x , int y , int index){
if(index == word.length()) return true;//结束条件
if(isOk(x,y) == false || board[x][y] != word.charAt(index)) return false;
vis[x][y] = true;
boolean ans = help(board , word , x + 1 , y , index+1) ||
help(board , word , x - 1 , y , index+1) ||
help(board , word , x , y + 1 , index+1) ||
help(board , word , x , y - 1 , index+1);
if(ans) return true;
vis[x][y] = false; //回溯
return false;
}
private boolean isOk(int x,int y){//用于判断当前位置是否是合法位置
if(x < 0 || x >= row || y < 0 || y >= col) return false;
if(vis[x][y]) return false;
return true;
}
【思考】
回溯算法在整个刷题系列里面出现的频次是非常高的。在我们后续刷题过程中,最主要的就是抓住两点,一个是回溯条件,还有一个就是结束条件,将这两个条件捋清楚之后,剩下的代码实现都是十分简洁的。
- Python3冒泡排序
- Python Selenium设计模式-POM
- 【Python学习笔记之一】Python关键字及其总结
- 前后端分离了,然后呢?
- 【Python学习笔记之二】浅谈Python的yield用法
- LINUX中常用操作命令
- Java异常抛出及try,catch应用实例
- GitHub实战系列~2.把本地项目提交到github中 2015-12-10
- 前20名Python机器学习开源项目
- 接口测试 | 24 requests + unittest集成你的接口测试
- [快学Python3]数据结构与算法-二分查找
- 基于Excel参数化你的Selenium2测试
- 【LeetCode】关关刷题日记24-Leetcode 121. Best Time to Buy and Sell Stock
- 线性表的链式存储结构的实现及其应用(C/C++实现)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 磁盘空间分析神器 - ncdu
- Kafka笔记—可靠性、幂等性和事务
- 工程能力UP!| LightGBM的调参与并行
- 你想要的Android性能优化系列:启动优化 !
- 微信小程序的自定义组件(入门)
- linux 中关于PAM的点滴笔记
- 49. Vue使用axios发送Ajax请求
- UCSC-browser学习:创建自己的track hubs
- 五分钟快速搭建Serverless免费邮件服务
- 基于qiankun落地部署微前端爬”坑“记
- Android推送的群魔乱舞
- 用百度接口实现图片文字识别,并打包成安装包软件
- 视野前端(二)V8引擎是如何工作的
- 【干货】Chrome插件(扩展)开发全攻略
- 超性感的React Hooks(一):为何她独具魅力