【剑指Offer】65、矩阵中的路径
题目描述:
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
解题思路:
本题实际并不复杂,是一个可以用回溯法解决的典型题目。所谓回溯法,就是有组织的进行穷举搜索的过程,通过深度优先来对所有可能的解进行穷举。
首先,遍历整个矩阵,我们可以找到和字符串str首字符相同的单元格,作为查找的起点,然后遍历它的上下左右四个字符,如果有和str下一个字符相同的,就以该单元格作为下一个遍历起点,依次进行,如果没有找到就回退到上一个字符,重新查找其他方向。整个过程是一个非常典型的回溯思路。
由于回溯法天生的递归特性,路径可以看做一个栈,当在矩阵中定位了路径中前n个字符的位置后,在第n个字符的上下左右(没有遍历过的)格子找第n+1个字符,如果没有找到,只能回退到第n-1个字符,重新定位第n个字符。
由于路径不能重复进入矩阵的格子,所以还需要一个和矩阵大小相同的布尔矩阵来标识每个单元格是否被访问过,这也是回溯法的惯用方法。
不难想到,实际上这个过程就对应了一棵树的深度优先遍历,具体可以结合以下代码进一步理解。
举例:
编程实现(Java):
public class Solution {
public boolean hasPath(char[] matrix, int rows, int cols, char[] str){
//回溯法搜索
if(matrix==null||rows<1||cols<1||str==null)
return false;
char[][] mat=new char[rows][cols];
boolean[][] flags=new boolean[rows][cols]; //标记每个节点是否已经访问过
for(int i=0;i<rows;i++){ //转化为矩阵
for(int j=0;j<cols;j++){
mat[i][j]=matrix[cols*i+j];
flags[i][j]=false;
}
}
//以上是数据准备,下面开始搜索
//从每个元素依次开始搜索
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++){ //以mat[i][j]开始
if(hasPath(mat,i,j,rows,cols,flags,str,0)==true) //找到了返回真
return true;
}
}
return false;
}
boolean hasPath(char[][] mat,int i,int j,int rows, int cols,boolean[][] flags,char[] str,int start){ //以mat[i][j]开始搜索
if(start==str.length) //str元素已经遍历完
return true;
if(i<0||i>=rows||j<0||j>=cols) //i,j超出范围
return false;
boolean res=false;
//i,j在范围内
if(mat[i][j]==str[start] && flags[i][j]==false) { //当前相等
flags[i][j]=true;
++start;
//上下左右四个方向查找
res=hasPath(mat,i-1,j,rows,cols,flags,str,start)||
hasPath(mat,i+1,j,rows,cols,flags,str,start) ||
hasPath(mat,i,j-1,rows,cols,flags,str,start) ||
hasPath(mat,i,j+1,rows,cols,flags,str,start);
if(res==false){ //没有找到,回溯
--start;
flags[i][j]=false;
}
}
return res;
}
}
【剑指Offer】65、矩阵中的路径的更多相关文章
- 剑指Offer 65. 矩阵中的路径 (回溯)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- [剑指Offer] 65.矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指 Offer 12. 矩阵中的路径 + 递归 + 深搜 + 字符串问题
剑指 Offer 12. 矩阵中的路径 题目链接 题目类似于迷宫的搜索. 需要注意的是,需要首先判断起始搜索的位置,可能有多个起点,都需要一一尝试. 每轮迭代的时候记得将是否遍历标记数组还原为未遍历的 ...
- 力扣 - 剑指 Offer 12. 矩阵中的路径
题目 剑指 Offer 12. 矩阵中的路径 思路1(回溯.DFS) 这题可以使用回溯+递归来解决,思路如下: 将二维数组的每一个元素都作为起点进行回溯查找 每次查找的时候,都有四个方向,但是上一个方 ...
- 【Java】 剑指offer(11) 矩阵中的路径
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字 ...
- Go语言实现:【剑指offer】矩阵中的路径
该题目来源于牛客网<剑指offer>专题. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...
- 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)
1. 题目描述 /* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径. 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. 如果一条 ...
- 剑指offer——13矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指 Offer 12. 矩阵中的路径
题目描述 是一道很常见的深搜题目,不过里面要考虑一些边界问题,比如走过的路径是不能再次走入的,所以我这里我自己的 代码想到是利用一个新的二维的数组,记录走过的路径,不过题解的直接将原二维数组中的路径隐 ...
- [剑指Offer]12-矩阵中的路径(回溯)
题目链接 https://www.nowcoder.com/practice/c61c6999eecb4b8f88a98f66b273a3cc?tpId=13&tqId=11218&t ...
随机推荐
- android微信开放平台,申请移动应用的应用签名怎样获取
在微信开放平台,申请移动应用的时候: https://open.weixin.qq.com/cgi-bin/appcreate? t=manage/createMobile&type=app& ...
- android 请求网络异步载入
/** * 封装ProecssDialog对话框 * */ public class LoadDialog extends ProgressDialog { private String title ...
- srm 539
http://mlz000.github.io/2015/07/15/srm-539/ 250 Description: 从若干个盒子中随意选择几个装石头.每一个盒子容量都有上下限,一旦选择使用某个盒 ...
- 浅析Linux字符设备驱动程序内核机制
前段时间在学习linux设备驱动的时候,看了陈学松著的<深入Linux设备驱动程序内核机制>一书. 说实话.这是一本非常好的书,作者不但给出了在设备驱动程序开发过程中的所须要的知识点(如对 ...
- 树莓派玩耍笔记1 -- 开箱 & 安装系统以及简单配置
零.前言 树莓派是什么? 吃的么? 呵呵,假设您连这个还不知道,真是out 了. 麻烦出门左拐.百度去(或者,看看官网去?),算了.还是粘贴一些大家都知道的树莓派百科吧: 树莓派由注冊于英国的慈善组织 ...
- 【数学】mex是什么
最近在看博弈论,SG函数,所以什么是mex呢 然后百度了一下得到: mex(S) 的值为集合 S 中没有出现过的最小自然数.例如,mex({1,2}) = 0.mex({0,1,2,3}) = 4
- Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图
Bing Maps进阶系列五:通过DeepEarth的MiniMap控件为Bing Maps扩展迷你小地图 Bing Maps Silverlight Control虽然为我们提供了简洁.方便的开发模 ...
- JSP-Runoob:JSP 服务器响应
ylbtech-JSP-Runoob:JSP 服务器响应 1.返回顶部 1. JSP 服务器响应 Response响应对象主要将JSP容器处理后的结果传回到客户端.可以通过response变量设置HT ...
- [App Store Connect帮助]一、 App Store Connect 使用入门(1)App Store Connect 工作流程
您使用 App Store Connect 提交并管理您在 App Store 中销售的 App,使用 TestFlight 分发您 App 的 Beta 版本,接受法律协议,输入您的税务和银行业务信 ...
- Java数组去重(利用数组,不借助集合)
今天有个同学问我说老师,Java里边数组怎么去重,在不借助List集合的情况下,最后呢我整理了一下,打算发一篇博文,希望能帮助到有用的人,大佬绕过 public static void arrUniq ...