每天一道leetcode:剑指 Offer 12. 矩阵中的路径(中等DFS深度优先遍历)

news2025/2/24 2:26:13

今日份题目:

给定一个 `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

提示

  • m == board.length

  • n = board[i].length

  • 1 <= m, n <= 6

  • 1 <= word.length <= 15

  • boardword仅由大小写英文字母组成

题目思路

DFS深度优先遍历,重点在于一次次的dfs递归调用。由于不知道从哪个位置开始遍历,所以遍历矩阵中所有的位置,在与字符串第一个字母相同的点开始dfs遍历判断是否有满足条件的情况。

dfs的具体过程:递归结束条件,如果中间某个位置的字母与字符串当前的字母不同,就返回false,如果字符串遍历完了,说明存在字符串,返回true。剩下的情况,需要遍历四个方向查看有无满足条件的下个位置,如果所有都有,就返回true,否则返回false。

代码

class Solution 
{
public:
    bool dfs(vector<vector<char>>& board,vector<vector<int>>& visited,int i,int j,string& s,int k) 
    {
        if(board[i][j]!=s[k]) return false;
        else if(k==s.length()-1) return true;//遍历完字符串s了,说明存在字符串s
        visited[i][j]=1;//标记当前位置为已到过
        vector<pair<int,int> > directions{{0,1},{0,-1},{1,0},{-1,0}};//标记四个方向
        bool result=false;
        for(const auto& dir:directions) //遍历四个方向
        {
            int ii=i+dir.first,jj=j+dir.second;//新的位置
            if(ii>=0&&ii<board.size()&&jj>=0&&jj<board[0].size()) 
            {
                if(!visited[ii][jj]) //当前位置还未到过
                {
                    bool res=dfs(board,visited,ii,jj,s,k+1);//继续遍历下一个位置
                    if(res) //为真,说明四个方向中找到正确的位置,返回真
                    {
                        result=true;
                        break;
                    }
                }
            }
        }
        visited[i][j]=0;//注意:标记为0,未遍历过,便于其他情况的遍历
        return result;
    }

    bool exist(vector<vector<char>>& board, string word) 
    {
        int n=board.size(),m=board[0].size();
        vector<vector<int>> visited(n,vector<int>(m));
        for(int i=0;i<n;i++) //遍历矩阵的行
        {
            for(int j=0;j<m;j++) //遍历矩阵的列
            {
                if(board[i][j]==word[0])
                {
                    bool flag=dfs(board,visited,i,j,word,0);
                	if(flag) return true;//以当前位置为起点可以找到字母
                }
            }
        }
        return false;
    }
};

提交结果

 欢迎大家在评论区讨论,如有不懂的代码部分,欢迎在评论区留言!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/863513.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文讲述什么是数字孪生?

当前世界正处于百年未有之大变局&#xff0c;数字经济在各国已成为经济发展的重点。数字经济也是我国社会经济发展的必经之路。 近些年&#xff0c;大数据、人工智能、数字孪生等技术的发展促使技术与国内各产业进一步融合&#xff0c;从而推动了各产业在智能化、数字化等方面…

雷军写的代码上热搜了!

就在昨天&#xff0c;「雷军写的代码」相关话题先后上了一波热搜和热榜。 出于好奇&#xff0c;第一时间点进去围观了一波。 原来雷总马上要在8月14日举办他的2023年度演讲了&#xff0c;并且也放出了对应的演讲海报。 这个海报可以说暗藏玄机&#xff0c;放大后仔细一看&#…

前端部署流程详解

部署流程 1.打包前端项目成一个dist文件夹 命令: npm run build作用&#xff1a;用vue-cli内部集成的webpack&#xff0c;把 .vue, .less, .js 等打包成浏览器可直接执行的代码 html&#xff0c;css&#xff0c;js。 结果&#xff1a;会在项目根目录下创建 /dist目录&…

UEFI+win7+多系统安装

物理主机先安装的Windows10&#xff0c;同时需要安装Windows7的双系统 1.在https://next.itellyou.cn/下载Windows 7 ISO 2.使用Rufus制作U盘安装盘 注意一定要选择FAT32格式&#xff0c;否则安装过程会卡住 3.由于官方纯净的安装镜像默认不支持UEFI安装&#xff0c;有两种解决…

github的issue最大支持的字符数为65536 characters

Issue templates and forms are currently unavailable. Please try again later. Comment is too long (maximum is 65536 characters) There was an error creating your Issue: body is too long (maximum is 65536 characters). 所以不能存储内容过大的markdown笔记&…

互联网医院|线上医疗平台如何建设运营服务商?

互联网医院平台紧密结合了大数据和人工智能技术&#xff0c;为医疗服务提供了更精准和个性化的解决方案。通过对海量的医疗数据进行分析和挖掘&#xff0c;平台能够为医生提供更多准确可靠的参考依据&#xff0c;辅助医生做出更好的诊断和治疗决策。 在选择互联网医院建设运营服…

Spring kafka源码分析——消息是如何消费的

文章目录 概要端点注册创建监听容器启动监听容器消息拉取与消费小结 概要 本文主要从Spring Kafka的源码来分析&#xff0c;消费端消费流程&#xff1b;从spring容器启动到消息被拉取下来&#xff0c;再到执行客户端自定义的消费逻辑&#xff0c;大致概括为以下4个部分&#x…

直播|深入解析 StarRocks 存算分离—云原生湖仓 Meetup#2

StarRocks 3.0 正式开启极速统一的湖仓新范式&#xff0c;借助云原生存算分离构架、极速数据湖分析、物化视图等重量级特性实现湖仓架构升级&#xff0c;兼具数据仓库查询高性能与数据湖低成本可扩展的优势&#xff0c;让用户更简单地实现极速统一的湖仓分析。 作为 StarRocks…

05-bean工厂的准备工作

入口方法 prepareBeanFactory(beanFactory);protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {// Tell the internal bean factory to use the contexts class loader etc.// 设置beanFactory的classloader为当前context的classloaderbeanF…

计算机组成原理-笔记-第六章

目录 六、第六章——总线 1、总线&#xff08;基本概念&#xff09; &#xff08;1&#xff09;总线的定义 & 特性 &#xff08;2&#xff09;串行 &并行 &#xff08;3&#xff09;总线的分类 &#xff08;4&#xff09;总线分类——功能 &#xff08;4.1&…

分布式数据库视角下的存储过程

存储过程很好呀&#xff0c;那些用不好的人就是自己水平烂&#xff0c;不接受反驳&#xff01;我就有过这样念头&#xff0c;但分布式数据库&#xff0c;更倾向少用或不用存储过程。 1 我从C/S时代走来 C/S架构时代的末期最流行开发套件是PowerBuilder和Sybase数据库&#xf…

性能测试最佳实践的思考,7个要点缺一不可!

性能测试是软件开发和应用过程中至关重要的环节。它是评估系统性能、稳定性和可扩展性的有效手段&#xff0c;可以确保软件在真实环境中高效运行。在现代技术快速发展的时代&#xff0c;性能测试的重要性愈发显著。 性能测试在软件开发和应用过程中的重要性不可低估。它是保障…

程序员怎么利用ChatGPT解放双手=摸鱼?

目录 1. 当你遇到问题时为你生成代码ChatGPT 最明显的用途是根据查询编写代码。我们都会遇到不知道如何完成任务的情况&#xff0c;而这正是人工智能可以派上用场的时候。例如&#xff0c;假设我不知道如何使用 Python 编写 IP 修改器&#xff0c;只需查询 AI&#xff0c;它就…

模拟实现string类

string类的接口有很多&#xff0c;这里我来梳理一下自己觉得有意思的几个&#xff0c;并模拟实现一下可以凑合用的my_string&#xff0c;话不多说直接开干&#xff1a; 注意事项 为了和库里的string冲突&#xff0c;所以就将自己实现的my_string放在一个命名空间里 namespace …

采用pycharm在虚拟环境使用pyinstaller打包python程序

一年多以前&#xff0c;我写过一篇博客描述了如何虚拟环境打包&#xff0c;这一次有所不同&#xff0c;直接用IDE pycharm构成虚拟环境并运行pyinstaller打包 之前的博文&#xff1a; 虚拟环境venu使用pyinstaller打包python程序_伊玛目的门徒的博客-CSDN博客 第一步&#xf…

明天就要去面试软件测试岗了,现在我能怎么做呢?

首先&#xff0c;时间已经不允许你进行大面积的专业复习&#xff0c;所以你应该做好能够立竿见影的准备工作&#xff1a; 1、整理好自己的仪表 先去理个发&#xff0c;让自己看起来精神一点&#xff0c;尤其是男生&#xff0c;整理头发&#xff0c;修修鬓角能够快速让人对自己…

安卓13不再支持PPTP怎么办?新的连接解决方案分享

随着Android 13的发布&#xff0c;我们迎来了一个令人兴奋的新品时刻。然而&#xff0c;对于一些用户而言&#xff0c;这也意味着必须面对一个重要的问题&#xff1a;Android 13不再支持PPTP协议。如果你是一个习惯使用PPTP协议来连接换地址的用户&#xff0c;那么你可能需要重…

机器学习实战——波士顿房价预测

波士顿房价预测 波士顿房地产市场竞争激烈&#xff0c;而你想成为该地区最好的房地产经纪人。为了更好地与同行竞争&#xff0c;你决定运用机器学习的一些基本概念&#xff0c;帮助客户为自己的房产定下最佳售价。幸运的是&#xff0c;你找到了波士顿房价的数据集&#xff0c;…

tabBar的使用

参考Api&#xff1a;全局配置 | 微信开放文档 (qq.com) 1.使用说明 2.使用详情 3.使用案例 在全局配置的app.json中 "tabBar": {"color": "#333","selectedColor": "#d43c33","backgroundColor": "#fff&qu…

【云原生】Kubernetes控制器中StatefulSet的使用

目录 1 什么是 StatefulSet 2 StatefulSet 特点 3 限制 4 使用 StatefulSet 1 搭建 NFS 服务 2 客户端测试 3 使用 statefulset 1 什么是 StatefulSet 官方地址&#xff1a; StatefulSet | Kubernetes StatefulSet 是用来管理有状态应用的工作负载 API 对象。 无状态应…