【面试经典 150 | 回溯】单词搜索

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 解题思路
    • 方法一:回溯
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【字符串】【回溯】


题目来源

79. 单词搜索


解题思路

方法一:回溯

思路

从每一个格子点开始搜索,利用回溯思想枚举所有字符串。在回溯中需要注意几个要点:

  • 明确返回条件:
    • 超出矩阵范围,直接 return
    • 格子点已经访问过,格点字符不是当前要找的字符,直接 retrun
  • 明确最终结束条件:已经到达 word 最后一个字符的洗标位置,更新 bool 值 find = true
  • 从当前格点向上下左右四个方向进行搜索,继续调用回溯函数 backtrack,最后记得恢复现场(可能不走当前的格点).

代码

class Solution {
private:const int dirs[4][2] = {{-1, 0}, {1, 0}, {0, 1}, {0, -1}};void backtrack(vector<vector<char>>& board, vector<vector<bool>>& visited, string word, bool& find, int i, int j, int pos) {// 是否超出矩阵范围if (i < 0 || i >= board.size() || j < 0 || j >= board[0].size())return;if (visited[i][j] || find || board[i][j] != word[pos])return;if (pos == word.size() - 1) {find = true;return;}visited[i][j] = true;for (int k = 0; k < 4; ++k) {int nx = i + dirs[k][0];int ny = j + dirs[k][1];backtrack(board, visited, word, find, nx, ny, pos + 1);}// 恢复现场visited[i][j] = false;}public:bool exist(vector<vector<char>>& board, string word) {int m = board.size(), n = board[0].size();vector<vector<bool>> visited(m, vector<bool>(n, false));bool find = false;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {backtrack(board, visited, word, find, i, j , 0);}				}return find;}
};

复杂度分析

时间复杂度:见 分析.

空间复杂度: O ( m n ) O(mn) O(mn) m m m n n n 分别为网格的行数和列数。我们额外开辟了 O ( m n ) O(mn) O(mn)visited 数组,同时栈的深度最大为 O ( m i n ⁡ ( L , m n ) ) O(min⁡(L,mn)) O(min(L,mn)) L L L 为字符串 word 的长度。


写在最后

如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。

最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。

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

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

相关文章

Cloudflare高级防御规则 看看我的网站如何用防御的

网站已趋于稳定&#xff0c;并且经过nginx调优。我想先分享一下Cloudflare的WAF规则&#xff0c;因为这是最有效的防御之一&#xff0c;可以抵御大量恶意攻击流量&#xff0c;我已经验证了数月。 对于海外独立站电商网站&#xff0c;Cloudflare的CDN服务是首选&#xff0c;它强…

1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍 每个激活函数的输入都是一个数字&#xff0c;然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素&#xff0c;如果不用激活函数的话&#xff0c;无论神经网络有多少层&#xff0c;输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性&am…

【ZZULIOJ】1091: 童年生活二三事(多实例测试)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 Redraiment小时候走路喜欢蹦蹦跳跳&#xff0c;他最喜欢在楼梯上跳来跳去。 但年幼的他一次只能走上一阶或者一下子蹦上两阶。 现在一共有N阶台阶&#xff0c;请你计算一下Redraiment从第0阶到第N阶…

代谢组数据分析七:从质谱样本制备到MaxQuant搜库

前言 LC-MS/MS Liquid Chromatography-Mass Spectrometry&#xff08;LC-MS/MS &#xff0c;液相色谱-质谱串联&#xff09;可用于残留化合物检测、有机小分子检测、鉴定和定量污染物以及在医药和食品领域添加剂检测和生物小分子等检测。 LC-MS/MS一般包含五个步骤&#xff…

为什么叫“机器学习”Machine Learning 而不是叫“计算机学习”?

有一门学科“机器学习”火了起来&#xff0c;它是计算机科学与数学结合的产物&#xff0c;它的目的是使计算机“聪明”起来&#xff0c;实现人工智能。可是&#xff0c;令人困惑的是它明明就是计算机学习&#xff0c;为什么不叫“计算机学习”而叫“机器学习”呢&#xff1f;这…

PCB概念(进程控制块)—— 操作系统(形象解释版)

在操作系统里&#xff0c;PCB就像是每个进程的小秘密日记。它记录了进程的所有私事&#xff0c;比如身份信息、运行状态、内存地址啦&#xff0c;CPU信息等&#xff0c;还有进程优先级之类的东西。 简单来说&#xff0c;操作系统用它来把握和控制所有进程的行踪&#xff0c;确…

剧情游戏如何制作?

制作剧情游戏是一个令人兴奋且富有挑战性的过程&#xff01;首先&#xff0c;你需要有一个扎实的故事框架&#xff0c;这个框架可以是一个详细的剧本或者是一个简要的大纲。在设计故事时&#xff0c;考虑到玩家的选择和互动是非常重要的&#xff0c;因为这些选择会影响到游戏的…

50. 【Android教程】xml 数据解析

xml 是一种标记扩展语言&#xff08;Extension Mark-up Language&#xff09;&#xff0c;学到这里大家对 xml 语言一定不陌生&#xff0c;但是它在 Android 中的运用其实只是冰山一角。抛开 Android&#xff0c;XML 也被广泛运用于各种数据结构中。在运用 xml 编写 Android 布…

HashMap的底层存储介绍

HashMap底层实现采用了哈希表&#xff0c;这是一种非常重要的数据结构。对于我们一行理解很多技术都非常有帮助。 数据结构中由数组和链表来实现对数据的存储&#xff0c;他们各有特点。 &#xff08;1&#xff09;数组&#xff1a;占用空间连续。寻址容易&#xff0c;查询速…

openlayer 使用ol-ext插件实现凸显区域

使用ol-ext插件实现凸显多变形 效果如图 1、创建openlayer var map; var view; var tileLayer, source, vector;function init() {tileLayer new ol.layer.Tile({source: new ol.source.TileArcGISRest({url: "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineStr…

Windows 10 使用 Vagrant 快速创建虚拟机

一、下载 VirtualBox 官网地址&#xff1a;Oracle VM VirtualBox 阿里云盘&#xff1a;阿里云盘分享 二、安装 VirtualBox 安装软件前请先确认 CPU 是否开启了虚拟化&#xff0c;要求开启 2.1、双击运行可执行文件后点击下一步 2.2、选择安装路径&#xff0c;为了避免中文乱码…

Rust Web开发实战:构建高效稳定的服务端应用

如果你厌倦了缓慢、占用大量资源且不稳定的模板化Web开发工具&#xff0c;Rust就是你的解决方案。Rust服务提供了稳定的安全保证、非凡的开发经验&#xff0c;以及能够自动防止常见错误的编译器。 《Rust Web开发》教你使用Rust以及重要的Rust库(如异步运行时的Tokio、用于Web…

OpenFeign修改HttpClient为Apache HttpClient 5

OpenFeign中http client 如果不做特殊配置&#xff0c;OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求&#xff0c; 由于默认HttpURLConnection没有连接池、性能和效率比较低。所以修改为Apache HttpClient 5。 总结为两步&#xff1a; 加依赖改yml 具体操作请往…

GORM数据库连接池对接Prometheus

一、背景与介绍 Golang的database/sql包定了关于操作数据库的相关接口&#xff0c;但是没有去做对应数据库的实现。这些实现是预留给开发者或者对应厂商进行实现的。 其中让我比较关注的是Golang的sql包有没有实现连接池pool的机制呢? 毕竟Golang是静态语言&#xff0c;类似J…

P6242 【模板】线段树 3(区间最值操作、区间历史最值)

【模板】线段树 3&#xff08;区间最值操作、区间历史最值&#xff09; - 洛谷 #define _CRT_SECURE_NO_WARNINGS #include<bits/stdc.h> using namespace std; #define ll long long #define endl "\n" #define PII pair<int,int> #define int long lon…

platformd device、driver注册过程

本文以smsc911x驱动为例 platform_device注册过程 该设备被定义在dts里面了 参考文章设备树节点转换为设备节点device_node、和平台设备资源platform_device_设备树节点转换成平台设备-CSDN博客 dts里面的节点会被转换为device_node和platform_device(并不是所有节点都会被转…

vi编辑器使用

说明&#xff1a;本文介绍vi编辑器使用&#xff1b; 介绍&基础使用 vi编辑器是linux操作系统中最常用的编辑器&#xff0c;使用vi或vim命令启动。vim是vi编辑器的增强版&#xff0c;大多数情况使用vi命令也会打开vim编辑器&#xff0c;为了方便介绍&#xff0c;以下均称v…

【数组】Leetcode 80. 删除有序数组中的重复项 II【中等】

删除有序数组中的重复项 II 其他算法导航栏 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在…

C#实战:图像清晰度增强介绍和案例实践

目录 一、图像清晰度增强介绍 二、开发流程 三、请求参数说明 四、输出参数说明

【Web】2024XYCTF题解(全)

目录 ezhttp ezmd5 warm up ezMake ez?Make εZ?мKε? 我是一个复读机 牢牢记住&#xff0c;逝者为大 ezRCE ezPOP ezSerialize ezClass pharme 连连看到底是连连什么看 ezLFI login give me flag baby_unserialize ezhttp 访问./robots.txt 继…