【回溯+剪枝】单词搜索,你能用递归解决吗?
文章目录
- 79. 单词搜索
- 解题思路:回溯(深搜) + 剪枝

79. 单词搜索
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
仅由大小写英文字母组成
进阶: 你可以使用搜索剪枝的技术来优化解决方案,使其在 board
更大的情况下可以更快解决问题?
解题思路:回溯(深搜) + 剪枝
毫无疑问这道题就是要使用深搜,或者说是回溯,它们两个的思想都是一样的,从同一个起点出发,然后一直往更深层次去遍历!但是因为这道题和那种迷宫问题不太一样,迷宫问题是只有一个入口,但是这道题入口可能不是第一个元素,可能是其它的元素开头,所以我们必须 在主调用函数中进行一个 for
循环遍历每个元素为入口的路径,如果出现了成功的情况,则直接返回即可,反之说明每个入口都是不成功匹配的,则直接返回一个 false
即可,如下所示:
bool exist(vector<vector<char>>& board, string word)
{for(int i = 0; i < board.size(); ++i){for(int j = 0; j < board[i].size(); ++j){if(递归函数的返回值 == true)return true;}}return false;
}
也就是说此时需要设计一个 dfs()
函数,帮助我们返回以某个元素为入口的路径中是否存在匹配的字符串!这个通过前面的刷题量,其实并不难解决,我们可以分下面三步走:
-
函数头的设计:
-
因为我们需要递归函数返回一个布尔值,所以返回值就是
bool
类型的! -
其次少不了的就是题目给的网格
board
以及要查找的字符串word
。 -
然后因为我们需要知道当前递归函数走到了目标字符串的哪个位置,所以需要一个
index
变量来标记! -
此外因为我们需要判断当前位置是否越界,所以需要有当前位置在网格中的坐标,所以需要
x
和y
来表示!bool dfs(vector<vector<char>>& board, string& word, int index, int x, int y);
-
-
递归函数出口:
-
因为这道题要求说同一个单元格内的字母不允许被重复使用,所以我们需要一个 全局的布尔类型二维数组
used
来标记当前位置是否已经走过,这样子往下的路径就能知道哪些该走哪些不该走! -
然后主要就是判断以下内容:
- 当前在网格中的坐标是不是越界了
- 当前元素是否已经走过了
- 当前元素是否为目标字符串中对应的字符
-
如果出现其中一个不符合的话,则直接
return false
即可!// 递归函数出口 if(x < 0 || x == board.size() || y < 0 || y == board[x].size() || used[x][y] == true || board[x][y] != word[index])return false;
-
-
函数体的内容:
- 函数体要做的事情无非就是进行处理当前元素、递归、回溯操作。
- 其中处理当前元素对于这道题来说就是标记进行当前元素已经走过,也就是将
used[x][y] = true
即可! - 递归操作的话,这里我们先判断一下是否
index
已经走完字符串,是的话说明找到了符合要求的(因为不符合的在函数出口已经被筛掉了,能到这里就是符合的),则直接返回正确即可;或者递归的子函数中也找到了字符串,那么也直接返回正确! - 对于回溯操作的话,只有当上面没找到字符串,才对当前元素进行恢复现场,然后返回失败给上一层,表示当前的路走不通,所以设置完
used[x][y] = false
之后,就直接返回错误即可。
- 其中处理当前元素对于这道题来说就是标记进行当前元素已经走过,也就是将
- 函数体要做的事情无非就是进行处理当前元素、递归、回溯操作。
完整代码如下所示:
class Solution {
private:bool used[6][6]; // 标记当前位置是否已经走过
public:bool exist(vector<vector<char>>& board, string word) {for(int i = 0; i < board.size(); ++i){for(int j = 0; j < board[i].size(); ++j){if(dfs(board, word, 0, i, j))return true;}}return false;}bool dfs(vector<vector<char>>& board, string& word, int index, int x, int y){// 递归函数出口if(x < 0 || x == board.size() || y < 0 || y == board[x].size() || used[x][y] == true || board[x][y] != word[index])return false;used[x][y] = true; // 标记进行当前元素已经走过// 如果走完字符串,说明找到了;或者递归的子函数中找到了字符串,则直接返回trueif(index == word.size() - 1 || dfs(board, word, index + 1, x + 1, y) || dfs(board, word, index + 1, x, y + 1) || dfs(board, word, index + 1, x - 1, y) || dfs(board, word, index + 1, x, y - 1))return true;// 只有当上面没找到字符串,才对当前元素进行恢复现场,然后返回失败给上一层,表示当前的路走不通used[x][y] = false;return false;}
};
相关文章:
【回溯+剪枝】单词搜索,你能用递归解决吗?
文章目录 79. 单词搜索解题思路:回溯(深搜) 剪枝 79. 单词搜索 79. 单词搜索 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 …...
deepseek接入pycharm 进行AI编程
要将DeepSeek接入PyCharm进行AI编程,可以按照以下步骤操作: ### 1. 获取DeepSeek API访问权限 DeepSeek通常以API的形式对外提供服务,你需要在其官方网站注册账号,申请API访问权限。在申请通过后,会获得API密钥(API Key),这是后续调用API的关键凭证。 ### 2. 安装必要…...
M系列/Mac安装配置Node.js全栈开发环境(nvm+npm+yarn)
一、安装 nvm(Node Version Manager) 打开终端,使用 curl 在 M 系列 Mac 上安装 nvm: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash对于非 M 系列的 Intel Mac,上述命令同样适…...
常见Linux命令的复习
常见命令 ls 列出工作目录 ls -l:以长格式显示目录下的文件和子目录信息。ls -a:显示所有文件和子目录,包括隐藏文件 ll 列出该目录下的详细信息 看到该目录下的所有目录和文件的详细信息 cd 切换当前工作目录里 cd /path/to/directory&…...
朴素贝叶斯算法相关文献
朴素贝叶斯是一种基于概率的简单但强大的分类算法。尽管其“朴素”假设(特征之间相互独立)在现实中往往不成立,但在许多实际应用中,它依然表现出色,尤其是在文本分类、垃圾邮件过滤和情感分析等领域。近年来࿰…...
【鸿蒙HarmonyOS Next实战开发】多媒体视频播放-ijkplayer
简介 ijkplayer是OpenHarmony和HarmonyOS环境下可用的一款基于FFmpeg的视频播放器。 演示 下载安装 ohpm install ohos/ijkplayer使用说明 import { IjkMediaPlayer } from "ohos/ijkplayer";import type { OnPreparedListener } from "ohos/ijkplayer";i…...
jvm - GC篇
如何减慢一个对象进入老年代的速度,如何降低GC的次数 堆内存细分 年轻代(Young Generation): 新创建的对象首先被分配在年轻代中。年轻代又被进一步划分为一个Eden区和两个Survivor区(通常称为S0和S1)。…...
edu小程序挖掘严重支付逻辑漏洞
edu小程序挖掘严重支付逻辑漏洞 一、敏感信息泄露 打开购电小程序 这里需要输入姓名和学号,直接搜索引擎搜索即可得到,这就不用多说了,但是这里的手机号可以任意输入,只要用户没有绑定手机号这里我们输入自己的手机号抓包直接进…...
职责链模式
介绍 避免将请求发送者和接收者耦合在一起,让多个对象都有机会接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 处理请求的对象组成一条链(职责链),职责链可…...
数据分析:企业数字化转型的金钥匙
引言:数字化浪潮下的数据金矿 在数字化浪潮席卷全球的背景下,有研究表明,只有不到30%的企业能够充分利用手中掌握的数据,这是否让人深思?数据已然成为企业最为宝贵的资产之一。然而,企业是否真正准备好从数…...
将Windows下的USB设备共享给WSL(ubuntu)
前言 本文用于学习记录,文中提到的方法也来自于网上资料,如有不对请指出,谢谢! 微软官方参考链接:https://learn.microsoft.com/zh-cn/windows/wsl/connect-usb 如果没有特殊标注,以下命令均在Windows终…...
UG NX二次开发(Python)-API函数介绍与应用实例(三)-UFLayer类操作
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1 前言2、UFLayer类说明3、获取当前工作图层4、移动对象到特定的图层1 前言 采用Python语言进行UG NX二次开发的帮助材料很少,采用录制的方法是一种比较容易实现的方式,但是使用UFun函数更容易上…...
【PostgreSQL内核学习 —— (WindowAgg(三))】
WindowAgg set_subquery_pathlist 部分函数解读check_and_push_window_quals 函数find_window_run_conditions 函数执行案例总结 计划器模块(set_plan_refs函数)set_windowagg_runcondition_references 函数执行案例 fix_windowagg_condition_expr 函数f…...
案例1.spark和flink分别实现作业配置动态更新案例
目录 目录 一、背景 二、解决 1.方法1:spark broadcast广播变量 a. 思路 b. 案例 ① 需求 ② 数据 ③ 代码 2.方法2:flink RichSourceFunction a. 思路 b. 案例 ① 需求 ② 数据 ③ 代码 ④ 测试验证 测试1 测试2 测试3 一、背景 在实时作业(如 Spark Str…...
一键掌握多平台短视频矩阵营销/源码部署
短视频矩阵系统的介绍与应用 随着数字化营销策略的不断演进,传统的短视频矩阵操作方法可能已显陈旧。为此,一款全新的短视频矩阵系统应运而生,它通过整合多个社交媒体账户、创建多样化的任务、运用先进的智能视频编辑工具、实现多平台内容的…...
如何利用maven更优雅的打包
最近在客户现场部署项目,有两套环境,无法连接互联网,两套环境之间也是完全隔离,于是问题就来了,每次都要远程到公司电脑改完代码,打包,通过网盘(如果没有会员,上传下载慢…...
Win11非虚拟机安装ISE14.7
官网下载6.18GB 的 Full Installer for Windows 7/XP/Server解压后运行安装程序不勾选Enable WebTalk to send software, IP ...安装程序卡死在ISE:Configure WebTalk,此时打开任务管理器,在详情中找到xwebtalk,右键结束任务。安装程序继续进…...
大彩讲堂:掌握虚拟屏调试的方法
一、适合范围 适合全系列大彩协议串口屏产品 二、开发环境版本 1. VisualTFT软件版本:V3.0.0.1037及以上的版本,版本查看方式: (1) 打开VisualTFT软件启动页面如图2-1所示,右上角显示的软件版本号; 图2-1 软件版本 (…...
k8sollama部署deepseek-R1模型,内网无坑
这是目录 linux下载ollama模型文件下载到本地,打包迁移到k8s等无网络环境使用下载打包ollama镜像非k8s环境使用k8s部署访问方式非ollama运行deepseek模型linux下载ollama 下载后可存放其他服务器 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linu…...
2025职业发展规划
2025职业发展规划 我是一名大公司的高级移动应用开发技术专家,目前参与了鸿蒙App开发,对鸿蒙的TS语言也有所了解。现在需要制定2025年的职业发展规划,包括学习内容和方向,并以思维导图的形式呈现。我需要梳理出合适的发展路径。首…...
VDN 微服务架构搭建篇(三)基于 Nacos 的 Spring Cloud Gateway 动态路由管理
VDN 微服务架构搭建篇(三):基于 Nacos 的 Spring Cloud Gateway 动态路由管理 在微服务架构中,网关 是整个系统的入口,负责 流量管理、请求路由、安全控制等关键功能。 Spring Cloud Gateway 作为 Spring 生态官方推荐…...
(3)yaml语法
yaml语法 YAML 是 “YAML Ain’t a Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言)。 通俗的来说yaml…...
SpringAI系列 - 使用LangGPT编写高质量的Prompt
目录 一、LangGPT —— 人人都可编写高质量 Prompt二、快速上手2.1 诗人 三、Role 模板3.1 Role 模板3.2 Role 模板使用步骤3.3 更多例子 四、高级用法4.1 变量4.2 命令4.3 Reminder4.4 条件语句4.5 Json or Yaml 方便程序开发 一、LangGPT —— 人人都可编写高质量 Prompt La…...
Linux提权--John碰撞密码提权
John the Ripper(简称 John)是一个常用的密码破解工具,可以通过暴力破解、字典攻击、规则攻击等方式,尝试猜解用户密码。密码的弱度是提权攻击中的一个重要因素,如果某个用户的密码非常简单或是默认密码࿰…...
系分成长指南
持续改进的核心理念:持续发现问题并改进,通过反馈和反馈循环优化工作流程。 如何制定反馈渠道:通过线上表格填写问卷、内部会议记录、即时消息等方式。 如何保持动力:设定具体目标、使用 KPI 测量进展、奖励机制、建立支持体系。 …...
5 计算机网络
5 计算机网络 5.1 OSI/RM七层模型 5.2 TCP/IP协议簇 5.2.1:常见协议基础 一、 TCP是可靠的,效率低的; 1.HTTP协议端口默认80,HTTPSSL之后成为HTTPS协议默认端口443。 2.对于0~1023一般是默认的公共端口不需要注册,1024以后的则需…...
绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程
文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 本文主要介绍如何在绿联NAS中使用ssh远程连接后,使用一行代码快速安装cpolar内网穿透工具,轻松实现随时随地远程访问本地内网中的绿联NAS,无需公网…...
Temperature、Top-P、Top-K、Frequency Penalty详解
在生成式AI(比如ChatGPT)中,Temperature、Top-P、Top-K、Frequency Penalty 这些参数用于控制文本生成的多样性、随机性和重复度,它们的作用如下: 1. Temperature(温度) 作用:控制输…...
2.6作业
1.思维导图 2.代码解释 struct A{double a; }; struct B{char b[8]; };int main(int argc,const char *argv[]) {struct A x;struct B y;x.a 3.14;y *(struct B*)&x;printf("y.b %lf\n",*(double *)y.b);return 0; } 注释: 1. 定义struct A类型变…...
面试笔记-多线程篇
为什么不直接调用run方法而是调用start方法? start方法会先创建一条线程,再用创建出的新线程去执行对应的run方法,这样才是起到多线程效果,如果直接调用run方法,则只是在原线程执行。 线程的sleep方法和wait方法的区别…...
stacking 框架
stacking stacking介绍 Stacking是个多层的多模型集合方法。每一层都可包括多个模型,下一层利用上一层模型的结果进行学习。可以只使用一层,然后用元学习器融合,也可以多层融合。 单层融合 多层融合 如上图所示,Stacking结构中…...
面向对象编程简介
面向对象编程(OOP)是一种编程范式,强调通过“对象”来设计软件。对象是数据和功能的封装,使得程序更易于理解和维护。本文将介绍面向对象的基本概念、特性以及其在软件开发中的重要性。 1. 面向对象的基本概念 1.1 对象 对象是…...
【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据
说明: 该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy(好几年前的文章),从本篇开始使用的是ArcGIS Pro 3.3.2版本自带的arcpy,需要注意不同版本对应的arcpy函数是存在差异的 数据准备:准备一…...
云计算——AWS Solutions Architect – Associate(saa)1、什么是云,AWS介绍
什么是云? 什么是云? 云计算(cloud computing)是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易护展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。 简单理解为:云是 共享资源,按需付费࿰…...
快手ip属地是定位吗?怎么改
在当今数字化时代,随着网络平台的不断发展,用户隐私和数据安全成为了公众关注的焦点。各大社交媒体平台纷纷推出的“IP属地”功能,无疑为网络环境增添了一抹新的色彩。其中,快手的IP属地显示功能尤为引人注目。那么,快…...
graylog初体验
最近graylog比较火,部署了一个来测试下,看下后续能不能代替目前占用资源比较多的elk,目前未对graylog性能进行深入测试,只是简单体验了下,graylog的UI比较简陋,但是在报警以及权限方面优于ELK,整…...
MySQL实战-解决方案
1. MySQL 主从集群同步延迟问题的解决方案 在主从复制架构中,主库执行写操作后,将更新事件写入 Binlog,从库通过 I/O 线程将 Binlog 数据同步到本地的 Relay Log,再由 SQL 线程解析并执行,从而保持数据一致性。然而&a…...
使用 CSS 实现透明效果
在 CSS 中,实现透明效果有几种方法,具体使用哪种方法取决于具体需求。以下是一些常见的方法: 使用 opacity 属性: opacity 属性可以设置整个元素的透明度,包括其所有的子元素。 .transparent { opacity: 0.5; /* 0 表…...
LabVIEW2025中文版软件安装包、工具包、安装教程下载
下载链接:LabVIEW及工具包大全-三易电子工作室http://blog.eeecontrol.com/labview6666 《LabVIEW2025安装图文教程》 1、解压后,双击install.exe安装 2、选中“我接受上述2条许可协议”,点击下一步 3、点击下一步,安装NI Packa…...
2025.2.5——五、[网鼎杯 2020 青龙组]AreUSerialz
题目来源:BUUCTF [网鼎杯 2020 青龙组]AreUSerialz 一、打开靶机,整理信息 直接得到一串php代码,根据题目可以看到还有序列化 二、解题思路 step 1:代码审计 <?phpinclude("flag.php");highlight_file(__FILE__…...
Oracle Life DBA的一天
/***************************************************************************************************************** Navicat Premium Data Transfer Source File : Oracle Life DBA的一天.sql Source Server Type : Oracle Source Server Version : 190…...
手写MVVM框架-实现简单v-bind
v-bind 有两种情况: 1.绑定的是一个简单的属性 <div :class"customClass">简单v-bind</div> 2.绑定的元素上面有表达式 <div :class"{customClass: a 1 > 2}">简单v-bind</div> 这一章我们先说第一种情况&…...
【力扣】240.搜索二维矩阵 II
题目 我的代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for(int i0;i<matrix.size();i){for(int j0;j<matrix[0].size();j){if(targetmatrix[i][j]){return true;}else if(target<matrix[i][j]){brea…...
PlanLLM: 首个支持开放词汇与封闭集任务的跨模态视频程序规划框架
2025年1月7号,由杨德杰、赵子敬、刘洋联合提出PlanLLM,一种基于可微调大型语言模型(LLM)的跨模态联合学习框架,用于解决视频程序规划任务。通过引入LLM增强规划模块和互信息最大化模块,PlanLLM突破了现有方…...
使用服务器部署DeepSeek-R1模型【详细版】
文章目录 引言deepseek-r1IDE或者终端工具算力平台体验deepseek-r1模型总结 引言 在现代的机器学习和深度学习应用中,模型部署和服务化是每个开发者面临的重要任务。无论是用于智能推荐、自然语言处理还是图像识别,如何高效、稳定地将深度学习模型部署到…...
TCP三次握手、四次挥手过程及原理
TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接。 无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接…...
AWS App2Container
AWS App2Container 是一个由 Amazon Web Services (AWS) 提供的工具,它帮助用户将现有的传统应用程序(特别是运行在虚拟机或物理服务器上的应用)转化为容器化的应用,从而可以在 AWS 上更方便地部署、管理和扩展。具体来说…...
《一》深入了解软件测试工具 JMeter-自我介绍
深入了解软件测试工具 JMeter 在当今的数字化时代,软件已经渗透到我们生活的方方面面,从日常使用的手机应用到复杂的企业级系统,软件的质量和性能直接影响着用户体验和业务的成功。而软件测试作为保障软件质量的关键环节,其中的性…...
(算法竞赛)图论+DFS深搜——图的dfs遍历1
题目描述 给定一个无向图,包含 n 个顶点(编号为 1 到 n)和 e 条边。要求从顶点 1 开始进行深度优先搜索(DFS),并按照访问顺序输出遍历结果。注意:当存在多个邻接点时,优先访问编号较…...
二级C语言题解:十进制转其他进制、非素数求和、重复数统计
目录 一、程序填空📝 --- 十进制转其他进制 题目📃 分析🧐 二、程序修改🛠️ --- 非素数求和 题目📃 分析🧐 三、程序设计💻 --- 重复数统计 题目📃 分析🧐 前言…...