【回溯+剪枝】单词搜索,你能用递归解决吗?

文章目录

  • 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
  • boardword 仅由大小写英文字母组成

进阶: 你可以使用搜索剪枝的技术来优化解决方案,使其在 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() 函数,帮助我们返回以某个元素为入口的路径中是否存在匹配的字符串!这个通过前面的刷题量,其实并不难解决,我们可以分下面三步走:

  1. 函数头的设计

    • 因为我们需要递归函数返回一个布尔值,所以返回值就是 bool 类型的!

    • 其次少不了的就是题目给的网格 board 以及要查找的字符串 word

    • 然后因为我们需要知道当前递归函数走到了目标字符串的哪个位置,所以需要一个 index 变量来标记!

    • 此外因为我们需要判断当前位置是否越界,所以需要有当前位置在网格中的坐标,所以需要 xy 来表示!

      bool dfs(vector<vector<char>>& board, string& word, int index, int x, int y);
      
  2. 递归函数出口

    • 因为这道题要求说同一个单元格内的字母不允许被重复使用,所以我们需要一个 全局的布尔类型二维数组 used 来标记当前位置是否已经走过,这样子往下的路径就能知道哪些该走哪些不该走!

    • 然后主要就是判断以下内容:

      1. 当前在网格中的坐标是不是越界了
      2. 当前元素是否已经走过了
      3. 当前元素是否为目标字符串中对应的字符
    • 如果出现其中一个不符合的话,则直接 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;
      
  3. 函数体的内容

    • 函数体要做的事情无非就是进行处理当前元素、递归、回溯操作。
      • 其中处理当前元素对于这道题来说就是标记进行当前元素已经走过,也就是将 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;}
};

在这里插入图片描述

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

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

相关文章

Redis企业开发实战(二)——点评项目之商户缓存查询

目录 一、缓存介绍 二、缓存更新策略 三、如何保证redis与数据库一致性 1.解决方案概述 2.双写策略 3.双删策略 3.1延迟双删的目的 4.数据重要程度划分 四、缓存穿透 (一)缓存穿透解决方案 (二)缓存穿透示意图 五、缓存雪崩 (一)缓存雪崩解决方案 (二)缓存雪崩…

【C语言】常量指针和指针常量,指针数组和数组指针,指针函数和函数指针怎么区分?

文章目录 1、常量指针和指针常量2、指针数组和数组指针3、指针函数和函数指针 1、常量指针和指针常量 int a 0; const int* p &a;//常量指针 int* const p1 &a;//指针常量常量指针&#xff1a;无法通过该指针修改指向地址中的内容。 指针常量&#xff1a;指针指向的…

maven如何不把依赖的jar打包到同一个jar?

spring boot项目打jar包部署&#xff1a; 经过以下步骤&#xff0c; 最终会形成maven依赖的多个jar&#xff08;包括lib下添加的&#xff09;、 我们编写的程序代码打成一个jar&#xff0c;将程序jar与 依赖jar分开&#xff0c;便于管理&#xff1a; success&#xff1a; 最终…

Mac 部署Ollama + OpenWebUI完全指南

文章目录 &#x1f4bb; 环境说明&#x1f6e0;️ Ollama安装配置1. 安装[Ollama](https://github.com/ollama/ollama)2. 启动Ollama3. 模型存储位置4. 配置 Ollama &#x1f310; OpenWebUI部署1. 安装Docker2. 部署[OpenWebUI](https://www.openwebui.com/)&#xff08;可视化…

leetcode——爬楼梯(java)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#x…

在C#中,Array,List,ArrayList,Dictionary,Hashtable,SortList,Stack的区别

Array Array你可以理解为是所有数组的大哥 普通数组 : 特点是长度固定, 只能存储相同类型的数据 static void Main(string[] args){//声明int[] ints;string[] strings;People[] peoples;//默认值 //int 类型是 0//string 类型是 nullint[] ints1 { 1, 2, 3 };string[] …

一次报警了解:direct path read、enq: KO - fast object checkpoint

背景 今天突然接到订单超时报警&#xff0c;数据库的状态确实惊出一身冷汗&#xff0c;查看系统日志正常&#xff0c;数据库日志正常&#xff0c;load 1-3之间&#xff0c;Session 连接200左右&#xff0c;未发现有负载。于是生成一个ASH报告&#xff0c;感觉比平时要慢很多&am…

19C RAC在vmware虚拟机环境下的安装

RAC安装规划 ===IP== ORA19C01 public ip : 192.168.229.191 heatbeat : 192.168.0.1 vip : 192.168.229.193 ORA19C02 public ip :192.168.229.192 heatbeat : 192.168.0.2 vip : 192.168.229.194 scan ip 192.168.229.195 hosts: echo "192.168.229…

【ABB阀门定位器EDP300如何进行自整定】

ABB阀门定位器EDP300如何进行自整定 自整定前准备 检查安装与连接 确保阀门和定位器安装正确&#xff0c;机械连接牢固&#xff0c;无卡阻或松动。 确认气源压力符合要求&#xff08;通常为1.4~7 bar&#xff09;&#xff0c;气路无泄漏。 确保4~20mA输入信号稳定且接线正确。…

Flink2支持提交StreamGraph到Flink集群

最近研究Flink源码的时候&#xff0c;发现Flink已经支持提交StreamGraph到集群了&#xff0c;替换掉了原来的提交JobGraph。 新增ExecutionPlan接口&#xff0c;将JobGraph和StreamGraph作为实现。 Flink集群Dispatcher也进行了修改&#xff0c;从JobGraph改成了接口Executio…

数据结构(1)——算法时间复杂度与空间复杂度

目录 前言 一、算法 1.1算法是什么&#xff1f; 1.2算法的特性 1.有穷性 2.确定性 3.可行性 4.输入 5.输出 二、算法效率 2.1衡量算法效率 1、事后统计方法 2、事前分析估计方法 2.2算法的复杂度 2.3时间复杂度 2.3.1定义 2.3.2大O渐进表示法 2.3.3常见时间复…

网络HTTP详细讲解

学习目标 什么是HTTPHTTP的请求和响应常见的HTTP状态码HTTP的安全性 什么是HTTP&#xff1f;HTTP的请求和响应&#xff0c;常见的HTTP状态码&#xff0c;HTTP的安全性 什么是HTTP HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种用…

Oracle 的归档日志文件(Archive log files)

-- 4.Oracle 的归档日志文件(Archive log files) /************************************************************************************************************************************************************* -- 1. RMAN 备份,开启archivelog后,log过多过大造成造…

spring aop失效场景

aop基于代理&#xff08;jdk动态代理 / cglib代理&#xff09;实现&#xff0c;即new了新的类实例&#xff0c;代理了原来的定义的类实例。 目录 1. final修饰的方法无法被代理2. 静态方法无法被代理3. 内部方法调用&#xff0c;即this.method()无法被代理4. 私有方法不能代理5…

Page Assist - 本地Deepseek模型 Web UI 的安装和使用

Page Assist Page Assist是一个开源的Chrome扩展程序&#xff0c;为本地AI模型提供一个直观的交互界面。通过它可以在任何网页上打开侧边栏或Web UI&#xff0c;与自己的AI模型进行对话&#xff0c;获取智能辅助。这种设计不仅方便了用户随时调用AI的能力&#xff0c;还保护了…

GRN前沿:STGRNS:一种基于transformer的可解释方法,用于从单细胞转录组数据推断基因调控网络

1.论文原名&#xff1a;STGRNS: an interpretable transformer-based method for inferring gene regulatory networks from single-cell transcriptomic data 2.发表日期&#xff1a;2023.4.2 摘要&#xff1a; 动机&#xff1a;单细胞RNA测序&#xff08;scRNA-seq&#xf…

vite共享配置之---css相关

vite和webpack都有对样式的处理&#xff0c;涉及到的有css、sass、scss、postcss、模块化&#xff0c;以下是vite和webpack对样式的处理方式 特性ViteWebpackCSS 处理方式自动处理&#xff0c;无需配置&#xff0c;使用浏览器的原生支持需要配置 style-loader 和 css-loader&a…

OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关

目标 学习将 OpenAI 接入 Web 应用&#xff0c;构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖&#xff1a; 打开终端或命令行&#xff0c;执行以下命令安装 Flask 和 OpenAI SDK&#xff1a; pip i…

深入浅出:旋转变位编码(RoPE)在现代大语言模型中的应用

在现代大语言模型&#xff08;LLMs&#xff09;中&#xff0c;位置编码是一个至关重要的组件。无论是 Meta 的 LLaMA 还是 Google 的 PaLM&#xff0c;这些模型都依赖于位置编码来捕捉序列中元素的顺序信息。而旋转变位编码&#xff08;RoPE&#xff09; 作为一种创新的位置编码…

MATLAB中matches函数用法

目录 语法 说明 示例 匹配文本 使用模式匹配十六进制数 匹配多个字符串 忽略大小写 matches函数的功能是确定模式是否与字符串匹配。 语法 TF matches(str,pat) TF matches(str,pat,IgnoreCasetrue) 说明 TF matches(str,pat) 会在指定模式与 str 有匹配时返回 1…