LeetCode-热题100: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 仅由大小写英文字母组成

代码及注释

func exist(board [][]byte, word string) bool {// 获取二维字符网格的行数和列数m, n := len(board), len(board[0])// 初始化访问标记数组visited := make([][]bool, m)for i := range visited {visited[i] = make([]bool, n)}// 定义DFS函数var dfs func(i, j, k int) bool dfs = func(i, j, k int) bool {// 如果已经找到单词的所有字符,则返回trueif k == len(word) {return true}// 如果当前位置超出边界,或者已经访问过,或者当前字符不匹配,则返回falseif i < 0 || j < 0 || i >= m || j >= n || visited[i][j] || board[i][j] != word[k] {return false}// 标记当前位置已访问visited[i][j] = true// 搜索上下左右四个方向if dfs(i + 1, j, k + 1) || dfs(i - 1, j, k + 1) || dfs(i, j + 1, k + 1) || dfs(i, j - 1, k + 1) {return true}// 回溯,撤销当前位置的访问标记visited[i][j] = falsereturn false}// 遍历二维字符网格,从每个位置开始搜索for i := 0; i < m; i++ {for j := 0; j < n; j++ {if dfs(i, j, 0) {return true}}}// 如果没有找到匹配的单词,则返回falsereturn false
}

代码解释:

  1. 获取二维字符网格的行数和列数

    m, n := len(board), len(board[0])
    

    获取二维字符网格 board 的行数 m 和列数 n

  2. 初始化访问标记数组

    visited := make([][]bool, m)
    for i := range visited {visited[i] = make([]bool, n)
    }
    

    使用 make 函数初始化一个二维布尔数组 visited,用于标记每个位置是否已经访问过。

  3. 定义DFS函数

    var dfs func(i, j, k int) bool 
    

    定义一个DFS函数 dfs,该函数将用于在二维字符网格 board 中搜索是否存在单词 word

  4. DFS函数的实现

    dfs = func(i, j, k int) bool {// 如果已经找到单词的所有字符,则返回trueif k == len(word) {return true}// 如果当前位置超出边界,或者已经访问过,或者当前字符不匹配,则返回falseif i < 0 || j < 0 || i >= m || j >= n || visited[i][j] || board[i][j] != word[k] {return false}// 标记当前位置已访问visited[i][j] = true// 搜索上下左右四个方向if dfs(i + 1, j, k + 1) || dfs(i - 1, j, k + 1) || dfs(i, j + 1, k + 1) || dfs(i, j - 1, k + 1) {return true}// 回溯,撤销当前位置的访问标记visited[i][j] = falsereturn false
    }
    
    • 终止条件:如果已经找到单词的所有字符(即 k == len(word)),则返回 true
    • 边界条件:如果当前位置超出边界,或者已经访问过,或者当前字符不匹配,则返回 false
    • 标记和搜索:标记当前位置已访问,然后搜索上下左右四个方向。
    • 回溯:在回溯时,撤销当前位置的访问标记。
  5. 遍历二维字符网格,从每个位置开始搜索

    for i := 0; i < m; i++ {for j := 0; j < n; j++ {if dfs(i, j, 0) {return true}}
    }
    

    使用双重循环遍历二维字符网格 board,从每个位置开始搜索是否存在单词 word

  6. 返回结果

    return false
    

    如果没有找到匹配的单词,则返回 false

通过这样的DFS递归实现,可以在 O(m*n*3^k) 的时间复杂度内搜索二维字符网格中是否存在单词 word,其中 mn 分别是二维字符网格的行数和列数,k 是单词 word 的长度。

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

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

相关文章

Day45:WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件

目录 PHP-MYSQL-二次注入-DEMO&74CMS DEMO-用户注册登录修改密码 CMS-74CMS个人中心简历功能 PHP-MYSQL-堆叠注入-DEMO&CTF强网 Demo 2019强网杯-随便注&#xff08;CTF题型&#xff09; PHP-MYSQL-带外注入-DEMO&DNSLOG(让服务器主动把数据交出去) 知识点&…

索引设计原则与性能优化实践

索引设计原则与性能优化实践是数据库管理中的关键领域&#xff0c;旨在提升数据库查询和更新操作的效率。以下是几个核心的索引设计原则与相关的性能优化实践&#xff1a; 索引设计原则&#xff1a; 1. 唯一性索引 - 如果存在一个字段的值是唯一的&#xff08;例如身份证号、学…

动手学深度学习|notebook教程

D2L.AI&#xff5c;《动手学深度学习》Notebooks 目录 面向中文读者的能运行、可讨论的深度学习教科书 含 PyTorch、NumPy/MXNet、TensorFlow 和 PaddlePaddle 实现 被全球 70 多个国家 500 多所大学用于教学 github 下面是整理好的&#xff0c;可以直接运行的notebook 0 前…

TensorFlow打印网络参数的个数

注意区分打印网络参数的个数和打印网络参数&#xff08;权重和偏置&#xff09;的个数 在TensorFlow 1.0 中&#xff0c;可以通过使用tf.trainable_variables()获取模型的所有可训练参数&#xff08;即权重和偏置&#xff09;&#xff0c;并使用sess.run()在会话中运行这些变量…

Ps:色彩平衡

色彩平衡 Color Balance命令可改变阴影、中间调、高光中的颜色平衡&#xff0c;从而改善图像的整体色彩表现或为图像创造特定的氛围。 Ps菜单&#xff1a;图像/调整/色彩平衡 Adjustments/Color Balance 快捷键&#xff1a;Ctrl B Ps菜单&#xff1a;图层/新建调整图层/色彩平…

如何实现JWT Token的自动续期

实现JWT&#xff08;JSON Web Tokens&#xff09;Token的自动续期主要涉及到两个关键的概念&#xff1a;刷新令牌&#xff08;Refresh Token&#xff09;和访问令牌&#xff08;Access Token&#xff09;。访问令牌通常有较短的有效期&#xff0c;而刷新令牌有较长的有效期。当…

Oracle Data Guard部署

Oracle的主备DG搭建 1. 修改主机名,同步时间 主库IP&#xff1a;192.168.100.137 备库IP&#xff1a;192.168.100.138配置主机名(主库) Hostname zygjpdb vim /etc/hosts 192.168.100.137 zygjpdb 192.168.100.138 zygjsdbvim /etc/sysconfig/network HOSTNAMEzygjpdb ------…

文件上传二—WEB攻防-PHP应用文件上传中间件CVE解析第三方编辑器已知CMS漏洞

演示案例&#xff1a; PHP-中间件-上传相关-Apache&NginxPHP-编辑器-上传相关-第三方处理引用PHP-CMS源码-上传相关-已知识别到利用 #PHP-中间件-上传相关-Apache&Nginx 复现漏洞环境&#xff1a;vulhub &#xff08;部署搭建看打包视频&#xff09; 由于PHP搭建常用中…

二叉树:递归算法的理解和运用

上一期中&#xff0c;我们了解到了堆&#xff0c;堆的结构也可以叫做二叉树的顺序结构&#xff0c;今天我们一起来看看二叉树的链式结构&#xff0c;我们还要学习有关于二叉树递归的书写。 首先&#xff0c;这是一个二叉树&#xff0c;但是对于普通的二叉树来说&#xff0c;增…

【Linux】详谈命令行参数环境变量

目录 一、浅谈命令行参数 二、环境变量 2.1环境变量的内涵以及理解 2.2PATH环境变量&#xff1a; 2.3输入程序名就能运行我们的程序 2.4系统中的环境变量 2.5导出环境变量 三、main函数的第三个参数 3.1获得环境变量的三种方法 四、本地变量 一、浅谈命令行参数 我们的m…

用自己的想法模拟实现库函数(2)完结篇

哈喽&#xff0c;小伙伴们&#xff0c;我们又见面了&#xff0c;上次讲完strlen函数的模拟实现后&#xff0c;发现还比较受大家欢迎&#xff0c;因此&#xff0c;本次给大家带来模拟函数的完结篇。温馨提示&#xff1a;本篇文章将会涉及到可能还未学到的实用性较高的库函数哟。…

Leetcode刷题笔记——动态规划之子序列问题篇

Leetcode刷题笔记——动态规划之子序列问题篇 一、回文 第一题&#xff1a;回文子串 Leetcode647. 回文子串&#xff1a;中等题 &#xff08;详情点击链接见原题&#xff09; 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着…

案例实践 | 基于长安链的煤质检测智慧实验室

案例名称-煤质检测智慧实验室 ■ 建设单位 国能数智科技开发&#xff08;北京&#xff09;有限公司 ■ 用户群体 煤炭生产单位、电力单位、化工单位等产业链上下游单位 ■ 应用成效 化验效率提升50%&#xff0c;出验时间缩短40%&#xff0c;提高化验数据市场公信力 案例…

数据降维 | Matlab实现POD本征正交分解数据降维模型

数据降维 | Matlab实现POD本征正交分解数据降维模型 目录 数据降维 | Matlab实现POD本征正交分解数据降维模型基本介绍模型描述程序设计基本介绍 1.Matlab实现POD本征正交分解数据降维模型(完整源码和数据); 2.运行环境matlab2023; 3.POD降维,POD分解(Proper Orthogonal D…

Lua热更新(Lua)

-- [[]] print 下载Lua For Windows Sublime Text&#xff08;仅用于演示&#xff0c;实际项目使用VsCode&#xff09; CtrlB运行 语法基础 基础类型&#xff1a;nil number string boolean 运算符&#xff1a;and-or-not ~ ^ if-then-end-elseif-else while-do-…

数据仓库——雪花模式以及层次递归

层次结构 钻取 向下钻取&#xff1a;对某些代表事实的报表中添加维度细节 向上钻取&#xff1a;从某些代表事实的报表中去除维度细节 属性层次 提供了一种自然方法&#xff0c;用于顺序地在不断深入的层次上组织事实。许多维度可以被理解为包含连续主从关系的属性层次。此类…

Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁

Java深度面试题&#xff1a;设计模式、内存管理与并发编程的综合考察 随着Java技术的不断发展&#xff0c;对Java开发者的技术要求也在不断提高。设计模式、内存管理、多线程工具类以及并发工具包和框架等都是Java开发者必须掌握的核心知识点。本文将通过三道综合性的面试题&a…

只有IP地址怎么实现HTTPS访问?

只有IP地址也可以实现HTTPS访问。虽然大部分SSL证书通常是针对域名发放&#xff0c;但也存在专门针对IP地址发放的SSL证书&#xff0c;这类证书允许服务器通过HTTPS协议为其公网IP地址提供安全的Web服务。当服务器配置了基于IP地址的SSL证书后&#xff0c;用户可以通过“https:…

第十届蓝桥杯大赛个人赛省赛(软件类)真题- CC++ 研究生组-字串数字

3725573269 #include<iostream> #include<map> #include<string> using namespace std; int main(){map<char, int> mp;string s "LANQIAO";long long ans 0, power 1;//7位数的26进制可能会超过int范围for(int i 1; i < 26; i){mp.…

深度学习(过拟合 欠拟合)

过拟合&#xff1a; 深度学习模型由于其复杂性&#xff0c;往往容易出现过拟合的问题。以下是一些深度学习中常见的过拟合原因和解决方法&#xff1a; 1. 数据量不足&#xff1a;深度学习模型通常需要大量的数据来进行训练&#xff0c;如果数据量不足&#xff0c;模型容易过度…