剑指 Offer 12 矩阵中的路径

news/2024/11/7 11:49:49/

题目: 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

例如,在下面的 3×4 的矩阵中包含单词 “ABCCED”(单词中的字母已标出)。

在这里插入图片描述
示例 1:

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true

示例 2:

输入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”
输出:false

思路:

题解:
根据b站思路讲解,加上力扣c++代码

https://www.bilibili.com/video/BV1qK4y1E7ST/?spm_id_from=333.337.search-card.all.click&vd_source=cc3333a27046bad449a2b6818cc4149c
https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/solution/mian-shi-ti-12-ju-zhen-zhong-de-lu-jing-shen-du-yo/
该题目可以从二维数组的任意位置进去开始找路径,因此写两个for循环来,如果有一个可以一直递归下去找到路径,返回true
在dfs中,如果超出i或者j的边界或者访问的当前元素不等于word中当前位置的元素,直接false
如果等于了,那么i和j都在范围并且当前元素也等于word当前元素,并且k等于word大小减1的话,
说明遍历到最后一个word元素了,并且也相等,那么直接true。
如果还没到最后一个,那么将当前board[i][j]的值保存到临时变量tmp中,
并将board[i][j]修改为一个可以标志该位置你已经访问的值,防止在上下左右访问的时候,
又访问到该元素,保存到临时变量tmp的目的是,为了等会回溯用。
紧接着,上下左右分别遍历看有没有和下一个word相等的,如果有不断递归,直到长度相等,
再后边加回溯,由于刚刚访问到的时候,修改了该处的值,为了不让重复访问,但是该路径没有找到可行的路
因此,递归返回到上一层去了,需要将该值回溯以下。


class Solution {
public:int m;//行int n;//列bool exist(vector<vector<char>>& board,string& word) {m = board.size();n = board[0].size();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (dfs(board, word, i, j, 0)) {return true;}}}return false;}bool dfs(vector<vector<char>>& board, string& word,int i,int j,int k) {if (i < 0 || i >= m || j < 0 || j >= n || board[i][j] != word[k])return false;if (k == word.size() - 1)return true;int tmp = board[i][j];board[i][j] = '#';bool res = dfs(board, word, i + 1, j, k + 1) || dfs(board, word, i - 1, j, k + 1) ||dfs(board,word,i,j+1,k+1) || dfs(board,word,i,j-1,k+1);board[i][j] = tmp;return res;}
};int main() {vector<vector<char>> board{{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}};Solution ss;string word = "ABCCED";cout << ss.exist(board,word) << endl;return 0;
}

http://www.ppmy.cn/news/99969.html

相关文章

Window的创建

Window的创建 上一篇说到了Window和WindowManager的关系并且讲述了WindowManager如何添加Window与Window内部的三个方法的实现 这篇主要讲几个常见的Window的创建比如Activity,Dialog和Toast 其中Activity属于应用Window Dialog属于子Window Toast属于系统Window z-order…

开闭原则正确姿势, 使用AOP优雅的记录日志, 非常的哇塞

&#x1f473;我亲爱的各位大佬们好&#x1f618;&#x1f618;&#x1f618; ♨️本篇文章记录的为 JDK8 新特性 Stream API 进阶 相关内容&#xff0c;适合在学Java的小白,帮助新手快速上手,也适合复习中&#xff0c;面试中的大佬&#x1f649;&#x1f649;&#x1f649;。 …

【Accessors注解】记录使用 lombook 注解姿势不对导致无法使用 BeanCopier 复制属性的问题

目录 背景定位问题分析原因为什么 BeanUtils.copyProperties() 可以为什么 BeanCopier 不可以 总结 背景 前几天看同事写的代码&#xff0c;发现不同分层对象之间的转换用的 spring 自带的 BeanUtils.copyProperties()&#xff0c;并且复制的还是对象集合。一时技痒&#xff0…

机器学习笔记 - 基于MATLAB的简单车牌识别系统参考代码

1、简述 车牌识别 (NPR) 是一种计算机视觉和模式识别技术,用于提取和解释车辆车牌上的字符。这里的重点是使用 MATLAB 实现一个简单的 NPR 系统,MATLAB 是一种用于科学计算和图像处理的强大编程语言和环境。目标是开发一个自动化系统,该系统可以检测图像中的车牌,从车牌中…

多元回归预测 | Matlab白鲸算法(BWO)优化BP神经网络回归预测,BWO-BP回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab白鲸算法(BWO)优化BP神经网络回归预测,BWO-BP回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %--------------…

表的增删改查

目录 表的增删改查create(创建)单行数据 全列插入多行数据 指定列插入插入否则更新替换 retrieve(读取)SELECT 列全列查询指定列查询查询字段为表达式为查询结果指定别名结果去重 WHERE 条件英语不及格的同学及英语成绩 ( < 60 )&#xff08;<&#xff09;语文成绩在 […

2.进程和线程

程序、进程、线程 概述 程序是静态的代码集合进程是程序在执行过程中的实例&#xff0c;是操作系统分配资源的基本单位线程是进程内的执行单位&#xff0c;用于实现并发执行和共享资源 程序&#xff08;Program&#xff09; 程序是指一组指令的集合&#xff0c;它是静态的、…

555定时器的基本原理和应用案例

前言 555定时器常用于脉冲波形的产生和整形电路中&#xff0c;之前在查找555定时器的原理图和基本管脚信息时&#xff0c;网上的内容大多含糊不清&#xff0c;没有讲的很详细&#xff0c;要么只是单一的管脚图&#xff0c;要么就是简单的文字解释&#xff0c;并且大多数缺乏基…