数组16--矩阵中的路径

2023-11-02

数组16--矩阵中的路径-jz65

题目概述

  • 算法说明
    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如
    a b c e
    s f c s
    a d e e
    矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。
  • 测试用例
    输入:
    [[a,b,c,e],
    [s,f,c,s],
    [a,d,e,e]],
    “abcced”
    输出:
    true
    输入:
    [[a,b,c,e],
    [s,f,c,s],
    [a,d,e,e]],
    “abcb”
    输出:
    false
    备注:
    0 <= matrix.length <= 200
    0 <= matrix[i].length <= 200

解析&参考答案

  • 解析
    回溯法:
    判断第一个字符有没有存在,满足三点就行:
    ①当前节点出界了
    ②这个格子已经走过了
    ③这个格子中的字符不是我们要找的
    如果以上三点任意一点满足的话,就return false,否则这个格子就是我们要找的。
    当该格子是要找的格子后,判断后面的格子,使用递归判断上下左右即可。只需要注意一点,如果某一个方向的格子不对,那就回溯,重新来过,判断其他方向。
  • 参考答案
vim jz65.go
package main

import "fmt"

func HasPath(matrix [][]byte, word string) bool {
	if len(matrix) == 0 || len(word) == 0 {
		return false
	}
	rows := len(matrix)
	columns := len(matrix[0])
	visited := make([][]bool, rows)
	for i := 0; i < rows; i++ {
		visited[i] = make([]bool, columns)
	}
	for i := 0; i < rows; i++ {
		for j := 0; j < columns; j++ {
			if matrix[i][j] == word[0] {
				if Backtrack(matrix, word, i, j, 0, &visited) {
					return true
				}
			}
		}
	}
	return false
}

func Backtrack(matrix [][]byte, word string, x, y, cur int, visited *[][]bool) bool {
	if cur == len(word) {
		return true
	}
	if x >= 0 && x < len(matrix) && y >= 0 && y < len(matrix[0]) && (*visited)[x][y] == false && matrix[x][y] == word[cur] {
		(*visited)[x][y] = true
		if Backtrack(matrix, word, x+1, y, cur+1, visited) || Backtrack(matrix, word, x, y+1, cur+1, visited) || Backtrack(matrix, word, x-1, y, cur+1, visited) || Backtrack(matrix, word, x, y-1, cur+1, visited) {
			return true
		}
		(*visited)[x][y] = false
	}
	return false
}

func main() {
	var arr = [][]byte{{'a', 'b', 'c', 'e'}, {'s', 'f', 'c', 's'}, {'a', 'd', 'e', 'e'}}
	// str := "abcb" // false
	str := "abcced" // true
	// [[A,B,C,E,H,J,I,G],[S,F,C,S,L,O,P,Q],[A,D,E,E,M,N,O,E],[A,D,I,D,E,J,F,M],[V,C,E,I,F,G,G,S]],"SGGFIECVAASABCEHJIGQEM" //true
	ret := HasPath(arr, str)
	fmt.Println(ret)
}

注意事项

  1. 当某个方向的格子不符合要求的时候,需要回溯,然后找其它方向的格子。

说明

  1. 当前使用 go1.15.8
  2. 参考 牛客网--剑指offer
    标题中jzn(n为具体数字)代表牛客网剑指offer系列第n号题目,例如 jz01 代表牛客网剑指offer中01号题目。

注意!!!

  • 笔者最近在学习 golang,因此趁机通过数据结构和算法来进一步熟悉下go语言
  • 当前算法主要来源于剑指 offer,后续会进一步补充 LeetCode 上重要算法,以及一些经典算法
  • 此处答案仅为参考,不一定是最优解,欢迎感兴趣的读者在评论区提供更优解
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组16--矩阵中的路径 的相关文章

  • 数据结构之链表与线性表

    数据结构之链表与线性表 线性表 顺序线性表 顺序表 顺序线性表 使用数组实现 一组地址连续的存储单元 数组大小有两种方式指定 一是静态分配 二是动态扩展 优点 随机访问特性 查找O 1 时间 存储密度高 逻辑上相邻的元素 物理上也相邻 缺点
  • 4399 C++笔试题

    1 写出一个函数 取到链表中倒数第二个节点 双链表 node getSec List mylist return mylist m tail gt m prev m prev为链表前指针 单链表 node getSec List mylis
  • 微软2013暑假实习生笔试题

    自己mark一下 以作后备 下面提交原文链接 原文博客 部分题目答案不确定 会持续更新 1 Which of the following calling convention s support s supportvariable leng
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • 如何根据链表节点数据大小对链表节点进行排序

    对链表排序有两种方法 1 比较了两个节点的大小后 对指针进行改变 从而交换节点的顺序 2 比较了两个节点的大小后 只交换数据域 而不改变指针 从而交换节点的顺序 第二种办法比较简单 本文主要对第二种方法进行讲解 链表节点排序算法 采用 冒泡
  • 数据结构小白之插入排序算法

    1 插入排序 1 1 思路 将n个需要排序的元素看成两个部分 一个是有序部分 一个是无序部分 开始的时候有序表只有一个元素 无序表有n 1个元素 排序过程中每次从无序表中取出元素 然后插入到有序表的适当位置 从而成为新的有序表 类似排队 如
  • 以太坊系列之十五: 以太坊数据库

    以太坊数据库中都存了什么 以太坊使用的数据库是一个NOSQL数据库 是谷歌提供的开源数据leveldb 这里尝试通过分析以太坊数据库存储了什么来分析以太坊可能为我们提供哪些关于区块链的API 存储内容 NOSQL是一个key value数据
  • 字符串09--表示数值的字符串

    字符串09 表示数值的字符串 jz53 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 请实现一个函数用来判断字符串是否表示数值 包括整数和小数 例如 字符串 100 5e2 123 3 1416 和 1E 16 都表示数值
  • 图 - Java实现无向带权图的邻接矩阵表示法

    图 Java实现无向带权图的邻接矩阵表示法 1 图 1 1 图的介绍 图 Graph 是一种复杂的非线性表结构 图中的元素我们就叫做顶点 vertex 图中的一个顶点可以与任意其他顶点建立连接关系 我们把这种建立的关系叫做边 edge 跟顶
  • 剑指Offer 12—矩阵中的路径

    题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 如果 word 存在于网格中 返回 true 否则 返回 false 单词必须按照字母顺序 通过相邻的单元格内的字母构成 其中 相邻 单元格是那些水平相邻
  • 算法学习——贪心算法之币种统计

    算法描述 币种统计 单位给每一位员工发工资 精确到元 为了保证不临时换零钱 使得每个员工取款的张数最少 在取工资前统计所有员工所需要的各种票面的张数 约定票种为100 50 20 10 5 2 1元 并验证币种统计是否正确 算法思路 算法描
  • 数理统计知识整理——回归分析与方差分析

    题记 时值我的北科研究生第一年下 选学 统计优化 课程 备考促学 成此笔记 以谨记 1 线性回归 1 1 原理分析 要研究最大积雪深度x与灌溉面积y之间的关系 测试得到近10年的数据如下表 使用线性回归的方法可以估计x与y之间的线性关系 线
  • 区块链中的哈希算法

    区块链中的密码学 密码学在区块链中的应用主要有两个 哈希算法与非对称加密算法 这次主要对哈希算法进行详细的说明 哈希算法 哈希算法的特点有 1 输入可以为任意大小的字符串 2 产生固定大小的输出 3 可以在合理的时间内算出输出值 若要满足密
  • 基数排序代码实现

    详情请看排序总结 传送门 https blog csdn net m0 52711790 article details 121914543 基数排序的知识点我就不贴出来 相信都能搜到对应概念解释 下面就直接上代码 代码解释其实也很清晰了
  • 用两个栈实现队列

    目录 一 栈的基本结构及其接口 二 我的队列结构定义 三 我的队列创建及其初始化 四 我的队列入队 五 我的队列出队 六 我的队列取队头元素 七 我的队列判空 八 我的队列销毁 一 栈的基本结构及其接口 栈的结构定义 typedef int
  • Leetcode2661. 找出叠涂元素

    Every day a Leetcode 题目来源 2661 找出叠涂元素 解法1 哈希 题目很绕 理解题意后就很简单 由于矩阵 mat 中每一个元素都不同 并且都在数组 arr 中 所以首先我们用一个哈希表 hash 来存储 mat 中每
  • 剑指 Offer(第2版)面试题 40:最小的 k 个数

    剑指 Offer 第2版 面试题 40 最小的 k 个数 剑指 Offer 第2版 面试题 40 最小的 k 个数 解法1 排序 解法2 快速选择 解法3 优先队列 剑指 Offer 第2版 面试题 40 最小的 k 个数 题目来源 53
  • 按照层次遍历结果打印完全二叉树

    按照层次遍历结果打印完全二叉树 按照推论结果 l 层首个节点位置 2 h l 1 l 层节点间距 2 h l 1 1 编码实现 public static
  • 从源码角度来谈谈 HashMap

    HashMap的知识点可以说在面试中经常被问到 是Java中比较常见的一种数据结构 所以这一篇就通过源码来深入理解下HashMap 1 HashMap的底层是如何实现的 基于JDK8 1 1 HashMap的类结构和成员 HashMap继承
  • 排序:计数排序

    一 概念 计数排序是非比较排序 是对哈希直接定址法的变形应用 二 思想 利用数组统计相同数据出现的次数 例如整型数据m出现n次 就在数组m位置记录数据为n 最后从头遍历数组打印数据即可 通俗来讲就是 数组下标即为数据 下标所指位置的值即为数

随机推荐

  • xshell6和xftp6运行提示缺少mfc110u.dll文件的解决办法

    转载自https blog csdn net makenothing article details 51929985 打开网址 http www microsoft com zh CN download details aspx id 3
  • pytorch网络m参数量、flops计算方法

    1 from thop import profile x torch randn 1 3 256 256 flops params profile self modelG inputs x print flops is 2fM flops
  • Windows 上 .NET Core 的先决条件

    https docs microsoft com zh cn dotnet articles core windows prerequisites Windows 上 NET Core 的先决条件 2017 1 5 1 分钟阅读时长 作者
  • 东南大学CTF之Flag你在哪里?

    题目 查看源代码 也只有一个Where is the flag 打开抓包软件 我用的是httpwatch 在http的响应头里面找到了flag 提交吧
  • 区块链学习笔记22——ETH-TheDAO

    区块链学习笔记22 ETH TheDAO 学习视频 北京大学肖臻老师 区块链技术与应用 笔记参考 北京大学肖臻老师 区块链技术与应用 公开课系列笔记 目录导航页 DAO Decentralized Autonomous Organizati
  • 应用服务器请求回调网络设置,回调服务器配置流程

    路由器拨号IP 10 102 24 190 一 进入医保专用路由器进行配置 三亚广慈医院 医保专用路由 192 168 133 1 密码 cwz090810yb 进入路由设置界面 点击应用管理 1 IP与MAC绑定 IP与MAC 均为本机信
  • 详解逻辑回归Logistic Regression

    详解逻辑回归Logistic Regression 详解逻辑回归Logistic Regression 什么是回归 从线性回归到Logistic回归 什么是逻辑回归 逻辑回归假设 logistic函数 logistic函数求导 逻辑回归的损
  • 深入浅出编译原理-5-一个简单语法分析器的C语言实现

    引言 前面已经介绍了编译器的预处理 词法分析 词法分析器的实现 也在其中说到了语法分析的任务和过程 语法分析的输入是词法单元序列 然后根据语言的文法表示 展开式 利用有限状态机理论 生成抽象语法树 然后遍历得到中间代码 即 三地址码 本节就
  • Spring Security - 06 修改默认的用户名和密码

    文章目录 环境 项目结构 修改默认的用户名和密码 测试 参考 环境 操作系统 Windows 10 x64 集成开发环境 Spring Tool Suite 4 Version 4 12 1 RELEASE Build Id 2021102
  • 纯 HTML+CSS+JS 编写的计算器应用

    点击上方 中兴开发者社区 关注我们 每天读一篇一线开发者原创好文 作者 dunizb 链接 segmentfault com a 1190000006977116 一道笔试题 之前偶然看到一个公司的笔试题 题目如下 用HTML5 CSS3
  • 【EI会议】2022年人工智能与统计学前沿国际会议(CFAIS 2022)

    2022年人工智能与统计学前沿国际会议 CFAIS 2022 重要信息 会议网址 www cfais org 会议时间 2022年12月16 18日 召开地点 中国北京 截稿时间 2022年10月31日 录用通知 投稿后2周内 收录检索 E
  • 需求:定义一个集合,添加一些学生对象,并进行遍历学生类的属性为:姓名,年龄。

    提示 题目答案均由博主自主编写 想法不一 答案也不一 本答案仅提供参考 如有疑问 可在评论区提问 有时间会解答 Student类 package llf test public class Student private int id pr
  • python中pass语句的作用是什么_Python中pass语句的作用

    在 Python 中 pass 是一个空语句 为了保持程序结构的完整性 一般情况下 pass 不做任何事情 被用作占位符 它的作用如下 1 空语句 do nothing 2 保证格式完整 3 保证语义完整 pass语法格式 pass 如果写
  • 发现一个好用的MySQL数据库管理工具

    免费在线MySQL数据库管理工具 平台地址 http open yesapi cn 一 管理自己的MySQL数据库 如果自己已经有一个MySQL数据库 那么可以直接配置到小白开放平台 就可以实现在线数据库管理了 首先 注册成功后 进入 设置
  • 七种寻址方式

    文章目录 1 立即寻址方式 2 直接寻址方式 3 寄存器寻址方式 4 寄存器间接寻址方式 5 寄存器相对寻址方式 6 基址加变址寻址方式 7 相对基址加变址寻址方式 七种寻址方式总结 寻址方式就是处理器根据指令中给出的地址信息来寻找有效地址
  • Exception in thread "main" java.net.BindException: Address already in use: NET_Bind

    在Java开发Socket中 可能会出现以下信息 Exception in thread main java net BindException Address already in use NET Bind 这是由于端口被占用了 解决的办
  • C++入门(1)简单变量和数据类型

    C 入门 1 简单变量和数据类型 最近在看Larry Ullman Andreas Signer 写的 写给大家看的C 书 做了一些笔记跟大家分享 希望会有所帮助 输入输出头文件 include
  • 编程教育已经走在全球化的路上

    据格物斯坦小坦克所知 在我国 现在仍有很多人觉得编程可有可无 无关考试升学 无关未来与就业 但在国外 编程教育早早便进入校园了 他们对编程的重视程度远超出我们的想象 在国外 少儿编程教育发展程度非常高 全球很多发达国家在基础教育中设立了编程
  • python读取excel生成柱状图

    可以使用 Python 的第三方库来读取 Excel 文件 比如 pandas openpyxl 等 这些库可以方便地将 Excel 中的数据读取出来并存储到一个数据框中 pandas 中的数据结构 然后使用 matplotlib 库来生成
  • 数组16--矩阵中的路径

    数组16 矩阵中的路径 jz65 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 请设计一个函数 用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径 路径可以从矩阵中的任意一个格子开始 每一步可以在矩阵中向左 向右 向