JZ65 矩阵中的路径
时间:2021-09-05
本文章向大家介绍JZ65 矩阵中的路径,主要包括JZ65 矩阵中的路径使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原题链接
描述
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如$$ \begin{bmatrix} a & b & c &e \ s & f & c & s \ a & d & e& e\ \end{bmatrix}$$ 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
示例
输入:[[a,b,c,e],[s,f,c,s],[a,d,e,e]],"abcced"
返回值:true
思路
DFS。要求矩阵的路径,首先知道起点可能在矩阵中任何一个格子,所以需要遍历所有格子找到word的第一个字符,然后开始深搜诸葛匹配word的各个字符,每次往上下所有四个方向探索,如果对应格子的元素不等于当前word待匹配的字符或者当前格子不合法(数组越界)都说明当前路径不存在,当搜索到word最后一个字符时表示成功。每次从一个格子开始搜索时,都要先把该格子标记为已遍历,以便于从该格子出发的搜索不会再重复搜索到该格子,最后如果没有找到路径的话,要恢复格子原来的元素。
解答
public class Solution {
public boolean hasPath(char[][] matrix, String word) {
// write code here
char[] chars = word.toCharArray();
// 七点不一定是 (0,0)
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (dfs(matrix, chars, i, j, 0)) return true;
}
}
return false;
}
public boolean dfs(char[][] matrix, char[] chars, int i, int j, int k) {
// 如果越界、不匹配
if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length || matrix[i][j] != chars[k]) return false;
// 一旦走到下面的就说明当前 matrix[i][j] == chars[k]
// 搜完了
if (k == chars.length - 1) return true;
//开始搜索
// 标记已经遍历的东西
matrix[i][j] = '\0';
boolean res = dfs(matrix, chars, i + 1, j, k + 1) || dfs(matrix, chars, i, j + 1, k + 1) ||
dfs(matrix, chars, i - 1, j, k + 1) || dfs(matrix, chars, i, j - 1, k + 1);
// 搜索回退
matrix[i][j] = chars[k];
return res;
}
}
本文来自博客园,作者:klaus08,转载请注明原文链接:https://www.cnblogs.com/klaus08/p/15228956.html
原文地址:https://www.cnblogs.com/klaus08/p/15228956.html
- 再议-Golang语言MessageBox用法实例
- linux下通过go语言获得系统进程cpu使用情况的方法
- Golang语言版ssh口令破解工具 --必须亲自敲代码,否则看了白看
- MySQL中insert语句没有响应的问题分析(r11笔记第21天)
- MySQL级联复制中的数据同步(第二篇)(r11笔记第21天)
- Golang语言 - 以任意类型的slices作为输入参数
- HDUOJ-------The Hardest Problem Ever
- Golang语言--【社区推荐阅读】 fmt用法
- 一个SQL性能问题的优化探索(一)(r11笔记第33天)
- HDUOJ-----1074 Integer Inquiry
- PXE无人值守安装Linux
- HDUOJ-----Robot Motion
- 对康托展开的一些心得...
- MySQL 5.7 General Tablespace学习(r11笔记第34天)
- 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 数组属性和方法
- 在群晖docker上装elmlang可视调试编码器ellie
- Elasticsearch:inverted index,doc_values及source
- 在群晖docker上构建私有云IDE和devops构建链
- 小白学PyTorch | 14 tensorboardX可视化教程
- Apache Solr 漏洞复现
- Elasticsearch rollover API
- 重发和重定向有什么区别与重定向应用
- 为tinycolinux制作应用包
- CrossC2的2.0版本
- 使用OpenCV和Python计算图像的“色彩”
- 为tinycolinux创建应用包-toolchain和编译方法
- [译]在Solidity中如何优化Gas第一部分:变量
- [译]Solidity 0.7.0 新变化
- 两个数组的交集 II
- 常说的手机刷新率60Hz、120Hz有什么不同?