当前位置: 首页 > news >正文

LeetCode 热题 100_单词搜索(60_79_中等_C++)(深度优先搜索(回溯))(初始化二维vector的大小)

LeetCode 热题 100_单词搜索(60_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

提示:
m == board.length
n = board[i].length
1 <= m, n <= 6
1 <= word.length <= 15
board 和 word 仅由大小写英文字母组成

题解:

解题思路:

思路一(深度优先搜索(回溯)):

1、根据搜索的过程,可以容易的推出使用深度优先的方法进行搜素。
具体思路如下:
① 在进行深度优先遍历的时候先判断表格中字母与word中第一个字母是否相同,若相同则进行深度优先搜索,每次搜索依次与word中的字母进行比较。
② 若每次比较字母相同则将此字母标记为已搜索,继续进行搜索,搜索到所有word中的字母则返回true。
③ 若不相同则将此次搜索之前搜索过的字母标记为未搜索。并从开始搜索的第一个字母的下一个字母进行判断搜索,直至搜索完整个图。

2、复杂度分析:
① 时间复杂度:一个非常宽松的上界为 O(MN3L ),M,N 为网格的长度与宽度。L 为字符串 word 的长度。在图上每个点进行一个深度搜先搜索,总共有 MN 个点。搜索失败,最深的搜索的深度为(L-1),每个点有上下左右四个搜索方向,方式搜索过的点不进行搜索,所以为 3L。所以总的时间复杂度为 O(MN3L )。
② 空间复杂度:

代码实现

代码实现(思路一(深度优先搜索(回溯))):
class Solution {
private:// backtracking 函数进行深度优先搜索,尝试在board上找到单词wordvoid backtracking(vector<vector<char>>& board, string &word, int row, int col, vector<vector<bool>> &mark, int i, bool &flag){// 递归出口:当已匹配完所有字符时(i == word.size() - 1),说明找到了匹配的单词if (i == word.size() - 1){flag = true;  // 设置 flag 为 true,表示找到了单词}// 尝试向上移动if (row - 1 >= 0 && !mark[row - 1][col] && board[row - 1][col] == word[i + 1]) {mark[row - 1][col] = true;  // 标记当前位置为已访问backtracking(board, word, row - 1, col, mark, i + 1, flag);  // 递归继续搜索if (flag) return;  // 如果找到了单词,立即返回mark[row - 1][col] = false;  // 如果未找到,回溯,标记为未访问}// 尝试向下移动if (row + 1 < board.size() && !mark[row + 1][col] && board[row + 1][col] == word[i + 1]) {mark[row + 1][col] = true;backtracking(board, word, row + 1, col, mark, i + 1, flag);if (flag) return;mark[row + 1][col] = false;}// 尝试向左移动if (col - 1 >= 0 && !mark[row][col - 1] && board[row][col - 1] == word[i + 1]) {mark[row][col - 1] = true;backtracking(board, word, row, col - 1, mark, i + 1, flag);if (flag) return;mark[row][col - 1] = false;}// 尝试向右移动if (col + 1 < board[0].size() && !mark[row][col + 1] && board[row][col + 1] == word[i + 1]) {mark[row][col + 1] = true;backtracking(board, word, row, col + 1, mark, i + 1, flag);if (flag) return;mark[row][col + 1] = false;}}public:// 主函数:遍历棋盘,尝试从每个位置开始查找单词bool exist(vector<vector<char>>& board, string word) {// mark 用来标记当前位置是否已经访问过,避免重复访问vector<vector<bool>> mark(board.size(), vector<bool>(board[0].size()));bool flag = false;  // 标记是否找到单词// 遍历棋盘中的每个位置,查找与单词首字母匹配的字符for (int row = 0; row < board.size(); row++) {for (int col = 0; col < board[0].size(); col++) {// 如果当前位置的字母与单词的第一个字母相同,开始深度优先搜索if (board[row][col] == word[0]) {mark[row][col] = true;  // 标记当前位置已访问backtracking(board, word, row, col, mark, 0, flag);  // 开始递归搜索if (flag) return true;  // 如果找到了,立即返回mark[row][col] = false;  // 如果没有找到,回溯}}}// 如果遍历完所有可能的起点都没有找到,返回 falsereturn false;}
};
以思路一为例进行调试
#include<iostream>
#include <vector>
using namespace std;class Solution {
private:// backtracking 函数进行深度优先搜索,尝试在board上找到单词wordvoid backtracking(vector<vector<char>>& board, string &word, int row, int col, vector<vector<bool>> &mark, int i, bool &flag){// 递归出口:当已匹配完所有字符时(i == word.size() - 1),说明找到了匹配的单词if (i == word.size() - 1){flag = true;  // 设置 flag 为 true,表示找到了单词}// 尝试向上移动if (row - 1 >= 0 && !mark[row - 1][col] && board[row - 1][col] == word[i + 1]) {mark[row - 1][col] = true;  // 标记当前位置为已访问backtracking(board, word, row - 1, col, mark, i + 1, flag);  // 递归继续搜索if (flag) return;  // 如果找到了单词,立即返回mark[row - 1][col] = false;  // 如果未找到,回溯,标记为未访问}// 尝试向下移动if (row + 1 < board.size() && !mark[row + 1][col] && board[row + 1][col] == word[i + 1]) {mark[row + 1][col] = true;backtracking(board, word, row + 1, col, mark, i + 1, flag);if (flag) return;mark[row + 1][col] = false;}// 尝试向左移动if (col - 1 >= 0 && !mark[row][col - 1] && board[row][col - 1] == word[i + 1]) {mark[row][col - 1] = true;backtracking(board, word, row, col - 1, mark, i + 1, flag);if (flag) return;mark[row][col - 1] = false;}// 尝试向右移动if (col + 1 < board[0].size() && !mark[row][col + 1] && board[row][col + 1] == word[i + 1]) {mark[row][col + 1] = true;backtracking(board, word, row, col + 1, mark, i + 1, flag);if (flag) return;mark[row][col + 1] = false;}}public:// 主函数:遍历棋盘,尝试从每个位置开始查找单词bool exist(vector<vector<char>>& board, string word) {// mark 用来标记当前位置是否已经访问过,避免重复访问vector<vector<bool>> mark(board.size(), vector<bool>(board[0].size()));bool flag = false;  // 标记是否找到单词// 遍历棋盘中的每个位置,查找与单词首字母匹配的字符for (int row = 0; row < board.size(); row++) {for (int col = 0; col < board[0].size(); col++) {// 如果当前位置的字母与单词的第一个字母相同,开始深度优先搜索if (board[row][col] == word[0]) {mark[row][col] = true;  // 标记当前位置已访问backtracking(board, word, row, col, mark, 0, flag);  // 开始递归搜索if (flag) return true;  // 如果找到了,立即返回mark[row][col] = false;  // 如果没有找到,回溯}}}// 如果遍历完所有可能的起点都没有找到,返回 falsereturn false;}
};int main(int argc, char const *argv[])
{// 初始化网格vector<vector<char>> board = {{'A','B','C','E'},{'S','F','C','S'},{'A','D','E','E'}};// 初始化要查找的单词 'word'string word = "ABCCED";// 创建 Solution 类的对象 's',用于调用 'exist' 函数// 如果找到了,输出 "true"Solution s;if (s.exist(board,word)){cout<<"true";}else{cout<<"false";}return 0;
}
部分代码解读

初始化二维vector的大小

vector<vector<bool>> mark(board.size(), vector<bool>(board[0].size()));

作用是创建一个与 board 尺寸相同的二维布尔数组 mark,并初始化为 false

LeetCode 热题 100_单词搜索(60_79)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

相关文章:

LeetCode 热题 100_单词搜索(60_79_中等_C++)(深度优先搜索(回溯))(初始化二维vector的大小)

LeetCode 热题 100_单词搜索&#xff08;60_79&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;深度优先搜索&#xff08;回溯&#xff09;&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&am…...

js闭包,跨域

js闭包&#xff0c;跨域 闭包 想象一下&#xff0c;你家有个大仓库&#xff08;函数&#xff09;&#xff0c;仓库里放着各种东西&#xff08;变量&#xff09;。一般情况下&#xff0c;你从仓库外面是看不到也拿不到仓库里的东西的。但是&#xff0c;闭包就像是你在仓库里留…...

算法练习(力扣-BFS)——102. 二叉树的层序遍历

题目描述&#xff08;简要概括&#xff09; 题目链接&#xff1a;102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 题目要求对给定的二叉树进行层序遍历&#xff08;从上到下&#xff0c;从左到右&#xff09;&#xff0c;并返回遍历的结果。层序遍历是一种基…...

Jetson Agx Orin平台preferred_stride调试记录--1924x720图像异常

1.问题描述 硬件: AGX Orin 在Jetpack 5.0.1和Jetpack 5.0.2上测试验证 图像分辨率在1920x720和1024x1920下图像采集正常 但是当采集图像分辨率为1924x720视频时,图像输出异常 像素格式:yuv_uyvy16 gstreamer命令如下 gst-launch-1.0 v4l2src device=/dev/video0 ! …...

nlp|微调大语言模型初探索(2),训练自己的聊天机器人

前言 上篇文章记录了具体的微调语言大模型步骤&#xff0c;以及在微调过程中可能遇见的各种报错&#xff0c;美中不足的是只是基于开源数据集的微调&#xff0c;今天来记录一下怎么基于自己的数据集去微调大语言模型&#xff0c;训练自己的智能机器人&#xff01;&#xff01;&…...

win11安装wsl报错:无法解析服务器的名称或地址(启用wsl2)

1. 启用wsl报错如下 # 查看可安装的 wsl --install wsl --list --online此原因是因为没有开启DNS的原因&#xff0c;所以需要我们手动开启DNS。 2. 按照如下配置即可 Google的DNS&#xff08;8.8.8.8和8.8.4.4) 全国通用DNS地址 (114.114.114.114) 3. 运行以下命令来重启 WSL…...

Gentleman:优雅的Go语言HTTP客户端工具包

gentlemen介绍&#xff0c;特点等 插件驱动架构&#xff1a;Gentleman的核心特点是其插件系统&#xff0c;允许用户注册和重用各种自定义插件&#xff0c;如重试策略或动态服务器发现&#xff0c;以增强HTTP客户端的功能。 中间件层&#xff1a;项目内置了一个上下文感知的层次…...

解锁豆瓣高清海报(三)从深度爬虫到URL构造,实现极速下载

脚本地址: 项目地址: Gazer PosterBandit_v2.py 前瞻 之前的 PosterBandit.py 是按照深度爬虫的思路一步步进入海报界面来爬取, 是个值得学习的思路, 但缺点是它爬取慢, 仍然容易碰到豆瓣的 418 错误, 本文也会指出彻底解决旧版 418 错误的方法并提高爬取速度. 现在我将介绍…...

IDEA单元测试插件 SquareTest 延长试用期权限

SquareTest是一款强大的IDEA单元测试生成插件工具&#xff0c;具体使用方法就不过多介绍了&#xff0c;这里主要介绍变更试用期&#xff0c;方便大家使用 配置信息 我的电脑安装前提配置条件 IntelliJ IDEA 2023.2windows 系统 软件安装 IntelliJ IDEA 直接安装插件Squar…...

PLC的五个学习步骤

五个学习步骤详解&#xff1a; 1. 夯实电气基础 (第一步) 核心思想: PLC控制技术是建立在传统电气控制技术之上的&#xff0c;因此扎实的电气基础至关重要。学习内容: 电气元件原理: 深入理解继电器、接触器、按钮、三相异步电机等常用电气元件的工作原理。这是理解电气控制回…...

深度学习05 ResNet残差网络

目录 传统卷积神经网络存在的问题 如何解决 批量归一化BatchNormalization, BN 残差连接方式 ​残差结构 ResNet网络 ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出&#xff0c;斩获当年ImageNet竞赛中分类任务第一名&#xff0c;目标检测第一名。获得CO…...

卷积神经网络CNN

目录 一、CNN概述 二、图像基础知识 三、卷积层 3.1 卷积的计算 3.2 Padding 3.3 Stride 3.4 多通道卷积计算 3.5 多卷积核卷积计算 3.6 特征图大小计算 3.7 Pytorch 卷积层API 四、池化层 4.1 池化计算 4.2 Stride 4.3 Padding 4.4 多通道池化计算 4.5 Pytorc…...

Android:播放Rtsp视频流的两种方式

一.SurfaceView Mediaplayer XML中添加SurfaceView: <SurfaceViewandroid:id"id/surface_view"android:layout_width"match_parent"android:layout_height"match_parent"/> Activity代码&#xff1a; package com.android.rtsp;impor…...

web信息泄露 ctfshow-web入门web1-web10

01做题思路 判断做题的思路是读取&#xff0c;写入&#xff0c;还是执行判断大概的类型&#xff0c;有登录逻辑就尝试sql注入&#xff0c;有下载逻辑就尝试文件读取&#xff0c;有源码就做源码审计 02信息泄露及利用 robots.txt 以ctfshow的web1为例&#xff0c;访问robots…...

Log4j在Spring项目中的应用与实践

在现代Java开发中&#xff0c;日志记录是不可或缺的一部分。它不仅帮助开发者调试和监控应用程序的运行状态&#xff0c;还能在出现问题时快速定位原因。今天&#xff0c;我们就来探讨如何在Spring项目中使用Log4j进行日志管理&#xff0c;并通过具体的实例来展示其强大的功能。…...

docker安装mysql:8.0

1.docker源 目前docker国内的源基本上用不了了&#xff0c;建议去淘宝找一找&#xff0c;我整了一个大概是10R一个月。 2.拉取镜像 docker pull mysql:8.0 3.启动容器 命令如下&#xff1a; docker run \-p 3306:3306 \-e MYSQL_ROOT_PASSWORD123456 \-v /home/data/mysq…...

搭建一个 Spring Boot 项目,解决jdk与springboot版本不匹配

搭建一个 Spring Boot 项目 方式一&#xff1a;使用 Spring Initializr Spring Initializr 是一个基于 Web 的工具&#xff0c;用于快速生成 Spring Boot 项目的基础结构。 访问 Spring Initializr 网站&#xff1a;https://start.spring.io/配置项目信息&#xff1a; …...

心心相系:十颗心

心心相系&#xff1a;十颗心 【1】心脏&#xff1b;人心&#xff0c;热心 heart //注&#xff1a;h-通c-或k- warmhearted a.热心的&#xff0c;热心肠的&#xff1b;亲切的a warm-hearted person 为人古道热肠 词根cardi(o)-(heart)&#xff0c;例词&#xff1a;cardiology(…...

ChatGPT行业热门应用提示词案例-AI绘画类

AI 绘画指令是一段用于指导 AI 绘画工具&#xff08;如 DALLE、Midjourney 等&#xff09;生成特定图像的文本描述。它通常包含场景、主体、风格、色彩、氛围等关键信息&#xff0c;帮助 AI 理解创作者的意图&#xff0c;从而生成符合要求的绘画作品。 ChatGPT 拥有海量的知识…...

前端面试手写--虚拟列表

目录 一.问题背景 二.代码讲解 三.代码改装 四.代码发布 今天我们来学习如何手写一个虚拟列表,本文将把虚拟列表进行拆分并讲解,然后发布到npm网站上. 一.问题背景 为什么需要虚拟列表呢?这是因为在面对大量数据的时候,我们的浏览器会将所有数据都渲染到表格上面,但是渲…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...