一起学习LeetCode热题100道(60/100)

news/2025/1/16 2:31:52/

60.单词搜索(学习)

给定一个 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[index] 不匹配,则返回 false。

二、匹配完成检查:
1.如果 index 已经等于 word.length - 1(即已经匹配完整个 word),则返回 true。

三、标记当前位置为已访问:
1.将当前位置标记为已访问,以避免重复访问。

四、向四个方向搜索:
1.定义四个方向(上、下、左、右)的偏移量数组 directions。
2.遍历这四个方向,对每个方向执行 dfs 递归调用,传入新的行和列索引(通过当前索引加上方向的偏移量得到),以及 index + 1(因为已经匹配了一个字符)。
3.如果在任何一个方向的搜索中找到了匹配的路径(即 dfs 返回 true),则立即返回 true。

五、回溯:
1.如果所有方向的搜索都失败了(即没有找到匹配的路径),则需要回溯,即将当前位置重新标记为未访问,以便其他路径可以访问它。
2.注意:这里的回溯是通过在 dfs 函数返回前将 visited[row][col] 设置为 false 来实现的。

var exist = function (board, word) {const rows = board.length;const cols = board[0].length;const visited = Array.from({ length: rows }, () => Array(cols).fill(false));// 辅助函数,用于进行深度优先搜索  function dfs(row, col, index) {// 检查边界条件和字符匹配  if (row < 0 ||row >= rows ||col < 0 ||col >= cols ||visited[row][col] ||board[row][col] !== word[index]) {return false;}// 如果已经匹配完整个单词,则返回 true  if (index === word.length - 1) {return true;}// 标记当前位置为已访问  visited[row][col] = true;// 继续向四个方向搜索  const directions = [[-1, 0], [1, 0], [0, -1], [0, 1]];for (const [dx, dy] of directions) {if (dfs(row + dx, col + dy, index + 1)) {return true;}}// 回溯,重置当前位置为未访问  visited[row][col] = false;return false;}// 遍历二维网格的每个位置,作为搜索的起点  for (let i = 0; i < rows; i++) {for (let j = 0; j < cols; j++) {if (dfs(i, j, 0)) {return true;}}}return false;
};

http://www.ppmy.cn/news/1520265.html

相关文章

Java-数据结构-链表-LinkedList(二)|ू・ω・` )

文本目录&#xff1a; ☛一、LinkedList&#xff08;无头双向非循环链表的结构&#xff09;&#xff1a; ☛ 二、LinkedList的模拟实现&#xff1a; ❄️1、操作方法&#xff1a; ▶&#xff08;1&#xff09;、display()方法&#xff1a; ▶&#xff08;2&#xff09;、size…

Linux下线程同步的方法

在Linux下&#xff0c;线程同步是保证多个线程在共享资源时&#xff0c;不会发生数据冲突或资源不一致的关键技术。以下是Linux下常用的几种线程同步方法&#xff0c;以及每种方法的简要解释和示例代码。 1. 互斥锁 (Mutex) 互斥锁是一种最基本的同步机制&#xff0c;它确保在…

无需前端技能:如何使用 Amis 框架简化页面开发

Amis 是一个由百度开源的前端低代码框架&#xff0c;它允许开发者通过 JSON 配置文件来快速生成各种后台管理页面。Amis 的设计理念是通过配置而非编码来实现页面的构建&#xff0c;这使得即使是不熟悉前端技术的开发者也能快速上手。Amis 提供了丰富的组件库和模板&#xff0c…

Broker服务器模块

一.Broker模块介绍 二.Broker模块具体实现 1. 类的成员变量与构造函数 成员变量 事件循环和TCP服务器: muduo::net::EventLoop _baseloop;muduo::net::TcpServer _server; 这些是muduo库提供的核心组件&#xff0c;负责处理网络事件和管理TCP连接。 消息分发和编码: muduo::…

OceanBase 关于 place_group_by HINT的使用

PLACE_GROUP_BY Hint 表示在多表关联时&#xff0c;如果满足单表查询后直接进行group by 的情形下&#xff0c;在跟其它表进行关联统计&#xff0c;减少表内部联接。 NO_PLACE_GROUP_BY Hint 表示在多表关联时&#xff0c;在关联后才对结果进行group by。 使用place_group_by …

系统编程-数据库

数据库 目录 数据库 引入 1、先安装数据库 2、数据库设置密码 3、数据库的进入和退出(前提 你的密码更改过了) 数据库的基本操作 1、显示所有的数据库 2、创建数据库 3、删除数据库 4、选择数据库 在数据库中对表进行操作 1、查看当前数据库中的表 2、在数据库中…

ET6框架(七)Excel配置工具

文章目录 一、Excel表的基本规则&#xff1a;二、特殊特殊标记三、编译路径说明四、动态获取数据五、可导表类型查看: 一、Excel表的基本规则&#xff1a; 在框架中我们的Excel配置表在ET > Excel文件夹中 1.在表结构中需要注意的是起始点必须在第三行第三列&#xff0c;且…

Leetcode面试经典150题-123.买卖股票的最佳时机III

解法都在代码里&#xff0c;不懂就留言或者私信 建议看这个之前先看股票系列的其他问题123.买卖股票的最佳时机III Leetcode面试经典150题-121.买卖股票的最佳时机-CSDN博客 Leetcode面试经典150题-122.买卖股票的最佳时机II-CSDN博客 Leetcode面试经典150题-188.买卖股票的…