力扣第79题 单词搜索

news2024/11/17 1:43:14

前言

记录一下刷题历程 力扣第79题 单词搜索


单词搜索

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

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

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

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
输出:true
示例 2:在这里插入图片描述

输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “SEE”
输出:true
示例 3:
在这里插入图片描述

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

分析

根据题意并没有好的简单的办法只能使用深度优先搜索一个一个匹配,以示例1为例,先是字母A发现匹配,然后分别向上下左右去找下一个匹配的,加入向下搜索发现不匹配那么就回溯到A继续搜索其它方向,直到搜索出单词返回true。

代码如下:

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        // 获取棋盘的行数和列数
        int rows = board.size();
        int cols = board[0].size();
        // 创建一个二维布尔数组用于标记每个位置是否被访问过
        vector<vector<bool>> visit(rows, vector<bool>(cols, false));

        // 遍历棋盘的每一个位置作为搜索的起点
        for (int row = 0; row < rows; row++) {
            for (int col = 0; col < cols; col++) {
                // 从当前起点位置开始进行深度优先搜索(DFS)
                if (dfs(board, word, row, col, 0, visit)) {
                    // 如果找到了目标单词,则返回 true
                    return true;
                }
            }
        }
        // 如果遍历完所有起点位置都没有找到目标单词,则返回 false
        return false;
    }

    bool dfs(vector<vector<char>>& board, string word, int row, int col, int index, vector<vector<bool>>& visit) {
        // 如果当前索引等于目标单词的长度,说明找到了完整的单词
        if (index == word.length()) {
            return true;
        }

        // 如果当前坐标超出棋盘边界,或者当前字符不匹配,或者当前坐标已经被访问过,则返回 false
        int rows = board.size();
        int cols = board[0].size();
        if (row >= rows || row < 0 || col >= cols || col < 0 || board[row][col] != word[index] || visit[row][col]) {
            return false;
        }

        // 标记当前位置已被访问
        visit[row][col] = true;

        // 递归地探索四个方向(上下左右),查找是否可以继续匹配目标单词
        bool res = dfs(board, word, row + 1, col, index + 1, visit) || // 向下
                   dfs(board, word, row - 1, col, index + 1, visit) || // 向上
                   dfs(board, word, row, col + 1, index + 1, visit) || // 向右
                   dfs(board, word, row, col - 1, index + 1, visit);   // 向左

        // 回溯时,取消当前位置的访问标记
        visit[row][col] = false;

        // 返回是否找到了目标单词
        return res;
    }
};

解释注释

1.exist 方法:该方法负责在棋盘上查找是否存在目标单词。

首先获取棋盘的行数和列数,并创建一个二维布尔数组 visit 用于记录每个位置是否已经被访问过。
遍历棋盘上的每一个位置,将其作为 DFS 搜索的起点。
对每个起点调用 dfs 方法进行深度优先搜索,如果找到了目标单词,则返回 true。
如果遍历完所有位置后都没有找到目标单词,则返回 false。

2.dfs 方法:这是一个递归函数,用于从当前坐标进行深度优先搜索。

当 index 等于目标单词的长度时,说明找到了完整的单词,返回 true。
如果当前位置超出边界、字符不匹配或已经被访问过,则返回 false。
标记当前位置已被访问,然后递归探索上下左右四个方向。
递归完成后,取消当前位置的访问标记(回溯),以便其他路径可以访问到该位置。
返回是否找到目标单词。

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

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

相关文章

解决ubuntu安装modelsim20.1 32位库依赖失败问题(附简易安装方法)

先说方法&#xff1a;不用管&#xff0c;直接继续安装软件就行。 注意&#xff0c;选中 libgtk-3-0t64:i386 而非 libgtk-3-0:i386 注意&#xff0c;选中 libcanberra0t64:i386 而非 libcanberra0:i386 注意&#xff0c;选中 libpng16-16t64:i386 而非 libpng16-16:i386 注意&…

白盒测试_学习总结

目录 一、白盒测试的概念理解 二、白盒测试的分类 1、静态分析 2、动态分析 &#xff08;1&#xff09;逻辑覆盖测试 a、语句覆盖 b、判定覆盖 c、条件覆盖 d、判定条件覆盖 e、条件组合覆盖 f、路径覆盖 &#xff08;2&#xff09;基本路径测试法 3、总结 一、白盒…

Arduino基础入门学习——BH1750(GY-302)+ LED模拟自动路灯的实现

BH1750&#xff08;GY-302&#xff09; LED 一、前言三、准备工作四、程序代码五、运行结果六、结束语 一、前言 相信很多人都见过一种路灯&#xff0c;白天的时候它是不亮的&#xff0c;等到了晚上环境变暗时就开始它的照明工作了&#xff0c;不了解的人可能认为是人为操纵它工…

如何编写Prompt,利用AI高效生成图表——图表狐(FoxChart)指南

在数据可视化领域&#xff0c;图表是数据的重要表达方式。为了让更多人能够轻松高校地生成美观、专业的图表&#xff0c;图表狐(FoxChart)应用而生。然而&#xff0c;要想充分发挥AI的潜力&#xff0c;编写合适的Prompt至关重要。本文介绍一些编写Prompt的原则&#xff0c;帮助…

代码随想录算法训练营第39天|198.打家劫舍、 213.打家劫舍II、337. 打家劫舍 III

目录 198.打家劫舍1、题目描述2、思路3、code4、复杂度分析 213.打家劫舍II1、题目描述2、思路3、code4、复杂度分析 337. 打家劫舍 III1、题目描述2、思路3、code4、复杂度分析 198.打家劫舍 题目链接&#xff1a;添加链接描述 1、题目描述 你是一个专业的小偷&#xff0c;计…

8、用户行为数据同步

1、 数据通道 用户行为数据由Flume从Kafka直接同步到HDFS&#xff0c;由于离线数仓采用Hive的分区表按天统计&#xff0c;所以目标路径要包含一层日期。具体数据流向如下图所示。 2、 日志消费Flume配置概述 按照规划&#xff0c;该Flume需将Kafka中topic_log的数据发往HDFS。…

cmake编译MQTT-C源码

Windows端编译MQTT-C源码&#xff0c;获取mqttc库&#xff08;动态库与静态库&#xff09;&#xff0c;用于集成到Qt工程中使用mqtt订阅与发布功能。 编译源码与编译出来的mqttc动态库、静态库下载​​​​​​​​​​​​​​https://download.csdn.net/download/qq_38159549…

直播怎么录屏?录屏网页的工具有吗?推荐这3款你千万不要错过~

直播与网页录屏&#xff1a;三款必备录屏软件推荐 为什么要记录直播&#xff1f;直播可以捕捉实时发生事件&#xff0c;是真真实实的one take&#xff0c;更重要的是可以记录直播画面中的实时弹幕、评论区的互动&#xff0c;无论是激动人心的体育赛事、教育课程还是互动性强的连…

C++11 14 17 20 23进化史

C11、C14、C17、C20和C23是C语言标准的不同版本&#xff0c;它们之间在功能、特性和语法上存在一些区别。以下是对这些版本主要区别的概述&#xff1a; C11 C11是C语言的一个重要标准&#xff0c;引入了大量新特性和改进&#xff0c;使C变得更加易用和强大。主要特性包括&…

Qt工程使用MQTT-C库与mqtt服务器数据通信

实现mqtt订阅与发布话题&#xff0c;与mqtt服务器进行数据通信 编译环境&#xff1a;Qt5.15.2 vs2019 需要mqttc库&#xff1a;mqttc.lib, mqttc.dll&#xff08;根据MQTT-C源码编译出来的库&#xff0c;参考cmake编译MQTT-C源码-CSDN博客&#xff09; 一、Qt pro文件编写 …

android kotlin 基础复习 继承 inherit

1、新建文件kt 2、代码&#xff1a; /**用户基类**/ open class Person1(name:String){/**次级构造函数**/constructor(name:String,age:Int):this(name){//初始化println("-------基类次级构造函数---------")println("name:${name},age:${age}")} }/**子…

信息安全工程师(1)计算机网络分类

一、按分布范围分类 广域网&#xff08;WAN&#xff09;&#xff1a; 定义&#xff1a;广域网的任务是提供长距离通信&#xff0c;运送主机所发送的数据。其覆盖范围通常是直径为几十千米到几千千米的区域&#xff0c;因此也被称为远程网。特点&#xff1a;连接广域网的各个结点…

计算机毕业设计 财会信息管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【吊打面试官系列-Redis面试题】怎么理解 Redis 事务?

大家好&#xff0c;我是锋哥。今天分享关于【怎么理解 Redis 事务&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 怎么理解 Redis 事务&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 1&#xff09;事务是一个单独的隔离操作&#xff1…

【LabVIEW学习篇 - 22】:ActiveX

文章目录 ActiveXActiveX打开Windows颜色选择对话框ActiveX将浏览器嵌入到前面板 ActiveX ActiveX是微软推出的一个开放的技术集的统称&#xff0c;它是很早之前出现的OLE(object linking and Embedding)技术的扩展&#xff0c;它是基于COM(Component Object Model)技术而建立…

meta元素

1&#xff0c;meta元素有4个全局属性 charset 设置文档的编码类型&#xff0c;通常设置为utf-8 <meta charset"utf-8" /> content 配合name或者http-equiv属性使用&#xff0c;为其value、 name 元数据名称(name的值)说明application name当前页所属Web应用系…

进程替换篇

文章目录 目录 前言 1.进程替换概念 2.进程替换的原理 3.进程替换的接口 4.接口功能验证 ①execl接口演示 ②execlp接口演示 ③execle接口演示 ④execv接口验证 5.尝试写一个自己的shell【了解】 前言 你一定见过类似于这样的“黑框框”&#xff0c;这个“黑框框”其实就是…

js 请求api + 解析数据 2个例子

起因&#xff0c; 目的: 补补 js 基础。 例1&#xff0c; 请求天气 api&#xff0c; 天气数据api js 中的 await await 关键字只能在 async 函数内部使用。函数内部可以使用 await&#xff0c;但是在函数外部直接使用 await 是不允许的。 async function fetchWeatherData…

[mysql]最基本的SELECT...FROM结构

第0种&#xff1a;最基本的查询语句 SELECT 字段名&#xff0c;字段名 FROM 表名 SELECT 1&#xff1b; SELECT 11,3*2&#xff1b; FROM SELECT 11,3*2 FROM DUAL&#xff1b;#dual&#xff1a;伪表 我们可以用它来保持一个平衡 这里我们的值不需要在任何一个表里&#xf…

MyBaits的初理解

一.Mybaits的简介 Mybaits就是对JDBC的简化&#xff0c;就是对持久化的实现。 二.基础 需要导的dependencies <dependencies><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId>&l…