剑指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;
}
【思考】
回溯算法在整个刷题系列里面出现的频次是非常高的。在我们后续刷题过程中,最主要的就是抓住两点,一个是回溯条件,还有一个就是结束条件,将这两个条件捋清楚之后,剩下的代码实现都是十分简洁的。
- CSS3与动画有关的属性transition、animation、transform对比
- 总结CSS3新特性(Transiton篇)
- 【实战】MS14-068域权限提升漏洞总结
- 总结CSS3新特性(Transform篇)
- Python 黑帽编程 4.2 Sniffer之数据本地存储和加载
- 老司机教你下载tumblr上视频和图片的正确姿势
- 总结CSS3新特性(媒体查询篇)
- 总结CSS3新特性(选择器篇)
- python无线网络安全入门案例【翻译】
- 总结CSS3新特性(颜色篇)
- RedTigers Hackit SQL 注入题解
- 【翻译】旧技术成就新勒索软件,Petya添加蠕虫特性
- [翻译]整合鼠标、触摸 和触控笔事件的
- co源码解读
- 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 数组属性和方法
- Linux atop监控
- go modules中使用replace用法
- 分布式文件系统Ceph的挂载方式
- 在CentOS 7上挂载CephFS
- Qt音视频开发14-mpv读取和控制
- 深入理解Nginx的rewrite模块
- max os 安装各种问题/Error解决方法
- 不要启用 net.ipv4.tcp_tw_recycle
- 利用SSH(无密码)免登录来节省你的生命
- 深入linux下磁盘Disk,分区Partition,挂载Mount
- 净化Git之rebase变基的使用
- Linux内存管理 一个进程究竟占用多少空间?-VSS/RSS/PSS/USS
- Bash:选择结构之case
- ElasticSearch的Reindex
- 10行Python代码自动清理电脑内重复文件,解放双手!