剑指offer--矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
解析:
在矩阵中任选一个格子作为路径的起点,假设格子中的字符为c,如果字符串中的第k个字符跟此相等,则往该格子四周找第i+1个字符。直
重复这个过程直到路径上的所有字符都在矩阵中找到相应的位置。
当在矩阵中定位了路径中前n个字符的位置之后,在与第n个字符对应的格子的周围都没有找到第n+1个字符,这个时候只要在路径上回到第n-1个字符,重新定位第n个字符。
由于路径不能重复进入矩阵的格子,还需要定义和字符矩阵大小一样的布尔值矩阵,用来标识路径是否已经进入每个格子
/**
这里题目用一个一维数组代替了二维矩阵,要找到一维数组的下标和二维数组下标的联系。 注意,所有下标都是从0开始的。如index代表一维下标,r,l代表二维数组下标,要使他们表示同一个元素,则有index=r*cols+l 用回溯法;对于二维矩阵,从(0,0)开始看是否满足要求, */ public class Solution { public boolean hasPath(char[] matrix, int rows, int cols, char[] str) { if(matrix==null||matrix.length==0||str.length>matrix.length) return false; //定义一个数组,表示是否已经走过 boolean[] flag=new boolean[matrix.length];
for(int i=0;i<rows;i++) for(int j=0;j<cols;j++){ //从(0,0)字符开始判断是否满足要求 if(isPath(matrix,rows,cols,i,j,str,0,flag)) return true; }
return false;
} /* 此方法的作用:在矩阵中,从r,l位置开始,是否存在一条包含字符串str从k开始的子串,flag为true的节点不可以走,规则如题 */ public boolean isPath(char[] matrix,int rows,int cols,int r,int l,char[] str,int k,boolean[] flag){ int index=r*cols+l; //判断字符串第一个字符是否相等 if(r<0||r>=rows||l<0||l>=cols||matrix[index]!=str[k]||flag[index]) return false; //上面条件已经保证了matrix[index]==str[k],所以k是str最后一个字符,则表明找到 if(k==str.length-1) return true; flag[index]=true; //判断下一个字符是否相等 if(isPath(matrix,rows,cols,r-1,l,str,k+1,flag)||isPath(matrix,rows,cols,r+1,l,str,k+1,flag) ||isPath(matrix,rows,cols,r,l-1,str,k+1,flag)||isPath(matrix,rows,cols,r,l+1,str,k+1,flag)) return true; //从(r,l)开始找,不存在这样的字符串,则退回去,从下一个位置开始找,此时需要将flag数组清除,表示还没有走过,从新开始 flag[index]=false; return false; }
} |
转载于:https://www.cnblogs.com/xiaolovewei/p/8029626.html
剑指offer--矩阵中的路径相关推荐
- 剑指offer 矩阵中的路径 @python
剑指offer 矩阵中的路径 @python 题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...
- [剑指Offer]-矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指offer:矩阵中的路径
题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中的某 ...
- 剑指offer——矩阵中的路径
问题描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...
- 不支持给定路径的格式_剑指offer_12_矩阵中的路径
//面试题12.矩阵中的路径 //题目:请设计一个函数,用来判断在一个矩阵中,是否存在一条包含某字符串所有字符的路径. //路径可以从矩阵中任意一格开始,每一步可以在矩阵中向左.右.上.下移动一格.如 ...
- 剑指Offer_12_矩阵中的路径(参考问题:马踏棋盘)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵 ...
- 剑指offer-矩阵中的路径
剑指offer-矩阵中的路径 问题描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个 ...
- 剑指 Offer II 110. 所有路径
链接: l剑指 Offer II 110. 所有路径 代码:代码没通过 class Solution { public:vector<vector<int>> allPaths ...
- 8. 返回数组里出现次数最多的数字_剑指offer 数组中出现次数超过一半的数字
题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...
- 剑指Offer-矩阵中的路径-Python
矩阵中的路径 题目描述: 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条 ...
最新文章
- 多个类的DLL封装及调用
- php web开发应用教程,PHP-Web 应用程序开发:使用模板_PHP
- Cookie的生命周期问题
- 添加vlan后无法上网_VLAN攻击如何有效防范?搞定虚拟局域网就在以下三点
- apache 编译php mysql_apache静/动态编译在apache+php+mysql应用
- Ubuntu如何启动Pycharm
- android ffmpeg 解码,如何在Android用FFmpeg解码图像
- 手把手教你训练一个秒杀科比的投篮AI,不服来练 | 附开源代码
- NUC1305 哥德巴赫猜想【筛选法】
- Linq系列(5)——表达式树之案例应用
- 如何优雅地计算多变量
- 史上最全Java项目实战课程(含项目实战+源码)
- Python 局域网扫描存活主机开放端口
- linux内存查看命令
- 高项_第一章信息化和信息系统
- 魔百盒哪款型号配置高_哪种电脑配置好 这两款电脑配置高良心价格
- yum.repos.d没有这个文件和目录解决方法
- 文档服务器地址如何进入,如何登陆服务器地址
- java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 报错的解决办法
- 嵌入式面试题之单片机知识
热门文章
- 信号量有没有容量限制?
- Salesforce新增Einstein AI支撑的自动化功能
- SHELL编程基础之BASH入门
- android四大组件之Activity以及常见的view处理
- fcm模糊聚类matlab实例_智能控制-Fuzzy控制- matlab
- oracle数据库考试答题,Oracle数据库试题
- 垃圾回收机制,垃圾回收的几种方法以及
- php.ini添加的变量读取,php用ini_get获取php.ini里变量值的方法
- 日语输入法电脑版_如何安装日语输入法?(手机/电脑安装使用指南)
- 4.3.1深度定时器(Timer in Depth)