剑指offer:JZ12 矩阵中的路径
JZ12 矩阵中的路径
描述
请设计一个函数,用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。例如
矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
示例1
输入:[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcced"返回值:true
分析
先说一下这道题使用的方法是深度优先算法dfs和回溯
dfs
深度优先算法就是一种图的遍历算法,简单来说就是从某个顶点的分支开始,尽可能深沿图的深度访问没有访问过的节点直至此分支全都访问完毕
解题
本人代码使用非递归实现了dfs+回溯,其中,一开始需要寻找矩阵中所有符合初始节点的字符位置,通过两个while循环完成算法
代码
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param matrix char字符型二维数组
* @param word string字符串
* @return bool布尔型
*/
public boolean hasPath (char[][] matrix, String word) {
/**
* 访问节点对象
*/
class HasPathNode{
char letter;
int x;
int y;
//标志其节点周围是否访问过
boolean visitUp = false;
boolean visitDown = false;
boolean visitLeft = false;
boolean visitRight = false;
HasPathNode(char letter,int x,int y) {
this.letter = letter;
this.x = x;
this.y = y;
//给出边界节点的判定
if (x == 0){
this.visitUp = true;
}
//给出边界节点的判定
if (y == 0) {
this.visitLeft = true;
}
//给出边界节点的判定
if (x == matrix.length -1) {
this.visitDown = true;
}
//给出边界节点的判定
if (y == matrix[0].length -1) {
this.visitRight = true;
}
}
}
// write code here
char words[] = word.toCharArray();
//把需要判断的字符放入链表
LinkedList<Character> wordsQueue = new LinkedList<>();
for (char item : words) {
wordsQueue.offer(item);
}
//已经经过判断的字符
Stack<Character> usedWords = new Stack<>();
//符合条件的初始节点
Queue<HasPathNode> firstLetterQueue = new LinkedList<>();
//寻找符合条件的初始节点
for (int i = 0;i<matrix.length;i++) {
for (int j = 0;j<matrix[0].length;j++) {
if (matrix[i][j] == wordsQueue.peek()) {
HasPathNode node = new HasPathNode(matrix[i][j],i,j);
firstLetterQueue.offer(node);
}
}
}
//如果没有符合的则返回false
if (firstLetterQueue.size() == 0)
return false;
//初始节点放入已使用
usedWords.push(wordsQueue.poll());
while (firstLetterQueue.size() >0) {
Stack<HasPathNode> nodeStack = new Stack<>();
nodeStack.push(firstLetterQueue.poll());
while (nodeStack.size() >0) {
if (nodeStack.peek().visitUp == false && matrix[nodeStack.peek().x - 1][nodeStack.peek().y] == wordsQueue.peek()) {
//上
HasPathNode node = new HasPathNode(wordsQueue.peek(),nodeStack.peek().x - 1,nodeStack.peek().y);
nodeStack.peek().visitUp = true;
nodeStack.push(node);
nodeStack.peek().visitDown = true;
usedWords.push(wordsQueue.poll());
}else if (nodeStack.peek().visitDown == false && matrix[nodeStack.peek().x + 1][nodeStack.peek().y] == wordsQueue.peek()) {
//下
HasPathNode node = new HasPathNode(wordsQueue.peek(),nodeStack.peek().x + 1,nodeStack.peek().y);
nodeStack.peek().visitDown = true;
nodeStack.push(node);
nodeStack.peek().visitUp = true;
usedWords.push(wordsQueue.poll());
}else if (nodeStack.peek().visitLeft == false && matrix[nodeStack.peek().x][nodeStack.peek().y - 1] == wordsQueue.peek()) {
//左
HasPathNode node = new HasPathNode(wordsQueue.peek(),nodeStack.peek().x,nodeStack.peek().y - 1);
nodeStack.peek().visitLeft = true;
nodeStack.push(node);
nodeStack.peek().visitRight = true;
usedWords.push(wordsQueue.poll());
}else if (nodeStack.peek().visitRight == false && matrix[nodeStack.peek().x][nodeStack.peek().y + 1] == wordsQueue.peek()) {
//右
HasPathNode node = new HasPathNode(wordsQueue.peek(),nodeStack.peek().x,nodeStack.peek().y + 1);
nodeStack.peek().visitRight = true;
nodeStack.push(node);
nodeStack.peek().visitLeft = true;
usedWords.push(wordsQueue.poll());
}else {
nodeStack.pop();
if (usedWords.size() != 1) {
wordsQueue.addFirst(usedWords.pop());
}
}
if (wordsQueue.size() == 0)
return true;
}
}
return false;
}
剑指offer:JZ12 矩阵中的路径的更多相关文章
- 剑指 Offer 12. 矩阵中的路径 + 递归 + 深搜 + 字符串问题
剑指 Offer 12. 矩阵中的路径 题目链接 题目类似于迷宫的搜索. 需要注意的是,需要首先判断起始搜索的位置,可能有多个起点,都需要一一尝试. 每轮迭代的时候记得将是否遍历标记数组还原为未遍历的 ...
- 力扣 - 剑指 Offer 12. 矩阵中的路径
题目 剑指 Offer 12. 矩阵中的路径 思路1(回溯.DFS) 这题可以使用回溯+递归来解决,思路如下: 将二维数组的每一个元素都作为起点进行回溯查找 每次查找的时候,都有四个方向,但是上一个方 ...
- 【Java】 剑指offer(11) 矩阵中的路径
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字 ...
- Go语言实现:【剑指offer】矩阵中的路径
该题目来源于牛客网<剑指offer>专题. 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向 ...
- 剑指Offer 65. 矩阵中的路径 (回溯)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- [剑指Offer] 65.矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指offer:矩阵中的路径(递归回溯法DFS类似迷宫)
1. 题目描述 /* 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径. 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子. 如果一条 ...
- 剑指offer——13矩阵中的路径
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 剑指 Offer 12. 矩阵中的路径
题目描述 是一道很常见的深搜题目,不过里面要考虑一些边界问题,比如走过的路径是不能再次走入的,所以我这里我自己的 代码想到是利用一个新的二维的数组,记录走过的路径,不过题解的直接将原二维数组中的路径隐 ...
- [剑指Offer]12-矩阵中的路径(回溯)
题目链接 https://www.nowcoder.com/practice/c61c6999eecb4b8f88a98f66b273a3cc?tpId=13&tqId=11218&t ...
随机推荐
- Linux下查看哪个网口插了网线
场景: 一台服务器有多个网卡,一个网卡有多个网口,当插了一根网线的时候,不知道网线是插在哪一个网口. 1.查看网口信息 2.查看网口是否插了网线(命令ethtool) 命令:ethtool + 网口名 ...
- 20200713晚 noip14
考场 很紧张,上午考太烂了 开场看到"影魔",想起以前看过(但没做),心态爆炸,咆哮时被 hkh diss 了 T1 一开始想建边跑最长路,每个点在记录一下 \(\min\{a\} ...
- Robot Framework(10)- 使用资源文件
如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 啥是资源文件 资 ...
- weblogic漏洞分析之CVE-2017-3248 & CVE-2018-2628
CVE-2017-3248 & CVE-2018-2628 后面的漏洞就是2017-3248的绕过而已,所以poc都一样,只是使用的payload不同 本机开启JRMP服务端 ->利用T ...
- 最小生成树-普利姆(Prim)算法
最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...
- cnblogs-theme-silence 主题设置简约风格
本文参考 更改博客皮肤 更改博客皮肤为Custom 页面定制CSS代码 勾选禁用模板默认CSS 导入复制该文件内容到代码框中 配置代码块复制功能 样式 和 右侧滑动条样式 /*复制功能添加按钮 beg ...
- cannot connect to chrome at 127.0.0.1:9222
window10系统,先cmd打开chrome, chrome --remote-debugging-port=9222 执行脚本 from selenium import webdriver fro ...
- 远程连接centos7中mysql8.0
远程连接centos7中mysql8.0 1.使用Navicat for MySQL或者其它数据连接软件 2.先检查centos中防火墙是否关闭,如果关闭不需要设置,如果没有关闭防火墙,请打开3306 ...
- AVS 端能力之音频播放模块
功能简介 音频播放 音频流播放 URL文件播放 播放控制 播放 暂停 继续 停止 其它功能(AVS服务器端实现) 支持播放列表 支持上一首下一首切换 支持电台 事件指令集 AudioPlayer 端能 ...
- Fiddler抓包(以谷歌浏览器、安卓手机为例)
fiddler抓包流程与whistle相同,所以本章内容会相对简洁.如果需要详细说明,可参考whistle抓包. 这里以谷歌浏览器.安卓手机为例. 1.fiddler安装 下载安装包,默认安装. 2. ...