当前位置: 首页 > news >正文

LintCode 123 · Word Search (DFS字符处理经典题!)

123 · Word Search
Algorithms
Medium
Description
Given a 2D board and a string word, find if the string word exists in the grid.

The string word can be constructed from letters of sequentially adjacent cell, where “adjacent” cells are those horizontally or vertically neighboring.

The same letter cell may not be used more than once.

The dimension of the letter matrix does not exceed 100, and the length of the string does not exceed 100.

Example
Example 1:

Input:

board = [“ABCE”,“SFCS”,“ADEE”]
word = “ABCCED”
Output:

true
Explanation:

[
A B C E
S F C S
A D E E
]
(0,0)->(0,1)->(0,2)->(1,2)->(2,2)->(2,1)

Example 1:

Input:

board = [“z”]
word = “z”
Output:

true
Explanation:

[ z ]
(0,0)

解法1:DFS+hashset。
很多小地方需要注意,特别是visited[][]数组什么时候clear掉。

class Solution {
public:/*** @param board: A list of lists of character* @param word: A string* @return: A boolean*/bool exist(vector<vector<char>> &board, string &word) {int m = board.size();if (m == 0) return word.empty();int n = board[0].size();string sol = "";for (int i = 0; i < word.size(); i++) {string tmpStr = word.substr(0, i + 1);s.insert(tmpStr);}vector<vector<bool>> visited;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {sol.clear(); //这里每次都要clear!不然后面的操作就append到s上面!visited.resize(m, vector<bool>(n, false));sol += board[i][j];if (check(board, word, sol, visited, i, j)) return true;}}return false;}
private:int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};set<string> s;bool check(vector<vector<char>> &board, string &word, string sol, vector<vector<bool>> &visited, int x, int y) {if (s.find(sol) == s.end()) return false;if (sol == word) {return true;}if (sol.size() >= word.size()) return false;visited[x][y] = true;for (int i = 0; i < 4; i++) {int newX = x + dx[i];int newY = y + dy[i];if (newX >= 0 && newX < board.size() && newY >= 0 && newY < board[0].size() && !visited[newX][newY]) {sol += board[newX][newY];if (check(board, word, sol, visited, newX, newY)) return true;else sol.pop_back();  //这一行重要!因为sol还要被for循环的其它i用到!}}visited[x][y] = false; //这一行重要,只有当dfs能够一直往下进行,visited[][]才不用动,否则如果dfs中途退出,visited[][]要clear。不然就跟后面操作冲突!return false; //这里别忘了,不然默认可能会返回true!!!}
};

二刷:不需要set。每次比较当前位置的字符就可以了。

class Solution {
public:/*** @param board: A list of lists of character* @param word: A string* @return: A boolean*/bool exist(vector<vector<char>> &board, string &word) {int m = board.size();if (m == 0) return word.empty();int n = board[0].size();string sol = "";vector<vector<bool>> visited;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {sol.clear();visited.resize(m, vector<bool>(n, false));sol += board[i][j];if (check(board, word, sol, 0, visited, i, j)) return true;}}return false;}
private:int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};bool check(vector<vector<char>> &board, string &word, string sol, int pos, vector<vector<bool>> &visited, int x, int y) {if (sol[pos] != word[pos]) return false;if (sol == word) {return true;}//if (sol.size() >= word.size()) return false; //这一行不需要!如果不匹配早就返回了,匹配上面也会返回true。visited[x][y] = true;for (int i = 0; i < 4; i++) {int newX = x + dx[i];int newY = y + dy[i];if (newX >= 0 && newX < board.size() && newY >= 0 && newY < board[0].size() && !visited[newX][newY]) {sol += board[newX][newY];if (check(board, word, sol, pos + 1, visited, newX, newY)) return true;else sol.pop_back();  //这一行重要!因为sol还要被for循环的其它i用到!}}visited[x][y] = false; //这一行重要,只有当dfs能够一直往下进行,visited[][]才不用动,否则如果dfs中途退出,visited[][]要clear。不然就跟后面操作冲突!return false;}
};

三刷: DFS+Trie
TBD

四刷:BFS
TBD

相关文章:

LintCode 123 · Word Search (DFS字符处理经典题!)

123 Word Search Algorithms Medium Description Given a 2D board and a string word, find if the string word exists in the grid. The string word can be constructed from letters of sequentially adjacent cell, where “adjacent” cells are those horizontally o…...

SpringCloud面试题——Sentinel

一&#xff1a;什么是Sentinel&#xff1f; Sentinel是一个面向分布式架构的轻量级服务保护框架&#xff0c;实现服务降级、服务熔断、服务限流等功能 二&#xff1a;什么是服务降级&#xff1f; 比如当某个服务繁忙,不能让客户端的请求一直等待,应该立刻返回给客户端一个备…...

【精选】 VulnHub (超详细解题过程)

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…...

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列

数据结构与算法-Rust 版读书笔记-2线性数据结构-队列 1、队列&#xff1a;先进先出 队列是项的有序集合&#xff0c;其中&#xff0c;添加新项的一端称为队尾&#xff0c;移除项的另一端称为队首。一个元素在从队尾进入队列后&#xff0c;就会一直向队首移动&#xff0c;直到…...

Android Kotlin Viewbinding封装

目录 Viewbinding配置 Activity封装 Activity使用 Fragment封装 Fragment使用 Dialog封装 Dialog使用 Viewbinding配置 android { viewBinding { enabled true } } Activity封装 import android.os.Bundle import android.view.LayoutInflater import androidx.ap…...

Flutter:web项目跨域问题解决

前后端解决系列 文章目录 一、Flutter web客户端解决本地环境调试跨域问题二、Flutter web客户端解决线上环境跨域问题 一、Flutter web客户端解决本地环境调试跨域问题 就一句命令【--web-browser-flag "--disable-web-security"】&#xff0c;用来屏蔽浏览器域名请…...

汽车标定技术(十二)--A2L文件生成的方法

目录 1.工具生成 1.1 CANape/ASAP2 Studio 1.2 ASAP2ToolKit 1.3 Matlab/Simulink 2.手写A2L要点 3.小结 A2L文件的制作一直以来是一个很少有人关注的方向,不管是标定工程师还是Slave协议栈的开...

《PySpark大数据分析实战》-03.了解Hive

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…...

经验分享|MySQL分区实战(RANGE)

概述 分区概述 在 MySQL 中&#xff0c; InnoDB存储引擎长期以来一直支持表空间的概念。在 MySQL 8.0 中&#xff0c;同一个分区表的所有分区必须使用相同的存储引擎。但是&#xff0c;也可以为同一 MySQL 服务器甚至同一数据库中的不同分区表使用不同的存储引擎。 通俗地讲…...

Arrays.asList() 和 Collections.singletonList()

Arrays.asList() 和 Collections.singletonList() 概述 List 是我们使用Java时常用的集合类型。众所周知&#xff0c;我们可以轻松地在一行中初始化列表。例如&#xff0c;当我们想要初始化一个只有一个元素的List时&#xff0c;我们可以使用Arrays.asList&#xff08;&#…...

Firmware Analysis Plus (Fap)固件模拟安装教程(最新)

最近在搞IoT的研究&#xff0c;但是难在设备比较难弄&#xff0c;只有固件&#xff0c;而没有设备&#xff0c;买吧&#xff0c;又太费钱&#xff0c;不划算。好在有很多项目可以在模拟环境中运行固件。但是几乎没有一个平台能够模拟所有硬件设备。IoT产品的架构也不尽相同。 …...

使用包、Crate 和模块管理项目(上)

目录 1、包和Crate 2、定义模块来控制作用域与私有性 2.1 在模块中对相关代码进行分组 3、引用模块项目的路径 3.1 使用 pub 关键字暴露路径 二进制和库 crate 包的最佳实践 3.2 super 开始的相对路径 3.3 创建公有的结构体和枚举 Rust 有许多功能可以让你管理代码的组…...

【Kotlin】

Lambda 就是一小段可以作为参数传递的代码。 因为正常情况下&#xff0c;我们向某个函数传参时只能传入变量&#xff0c;而借助Lambda 却允许传入一小段代码。 Lambda 表达式的语法结构&#xff1a; {参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}首先&#xff0c;最外…...

JavaDay17

创建不可变集合 import java.util.Iterator; import java.util.List;public class Test {public static void main(String[] args) {/*创建不可变的List集合* "张三" "李四" "王五" "赵六*///一旦创建之后 是无法进行修改的 在下面的代码…...

Python爬取酷我音乐

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…...

项目实战第四十七讲:易宝支付对接详解(保姆级教程)

易宝支付对接(保姆级教程) 为了实现项目的支付需求,公司选择了易宝支付进行对接,本文是项目实战第四十七讲,详解易宝支付对接。 文章目录 易宝支付对接(保姆级教程)1、需求背景2、流程图3、技术方案4、相关接口4.1、入驻相关(商户入网)4.2、账户相关接口(充值、提现、…...

python的websocket方法教程

WebSocket是一种网络通信协议&#xff0c;它在单个TCP连接上提供全双工的通信信道。在本篇文章中&#xff0c;我们将探讨如何在Python中使用WebSocket实现实时通信。 websockets是Python中最常用的网络库之一&#xff0c;也是websocket协议的Python实现。它不仅作为基础组件在…...

Qt处理焦点事件(获得焦点,失去焦点)

背景&#xff1a; 我只是想处理焦点动作&#xff0c;由于懒&#xff0c;上网一搜&#xff0c;排名靠前的一位朋友&#xff0c;使用重写部件的方式实现。还是因为懒&#xff0c;所以感觉复杂了。于是又花了一分钟解决了一下。 所以记录下来&#xff0c;以免以后忘了。 思路&a…...

SiteGround如何设置WordPress网站自动更新

SiteGround Autoupdate功能会自动帮我们更新在他们这里托管的所有WordPress网站&#xff0c;这样做是为了保证网站安全&#xff0c;并且让它们一直保持最新状态。他们会根据我们选择的设置自动更新不同版本的WordPress&#xff0c;包括主要版本和次要版本。在每次自动更新之前&…...

http代理和SOCK5代理谁更安全?

在这个网络化的时代&#xff0c;我们常常听到HTTP代理和SOCKS5代理这两个名词&#xff0c;不过很多人并不了解是什么意思。今天&#xff0c;我们将揭开这两种代理的神秘面纱&#xff0c;看看到底HTTP代理和SOCKS5代理哪个更安全&#xff1f; HTTP代理&#xff1a;高效通信的“枢…...

如何让任何老旧手柄在PC游戏中完美工作:3步终极解决方案

如何让任何老旧手柄在PC游戏中完美工作&#xff1a;3步终极解决方案 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 还在为心爱的游戏手柄无法在PC上使用而烦…...

2025届毕业生推荐的AI论文方案推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 身为前沿那种 AI 工具的 DeepSeek&#xff0c;能够明显提高学术论文写作的效率。于文献综述这…...

Liquibase,数据库无关的版本控制工具!

在现代软件开发中&#xff0c;数据库的版本控制往往比代码版本控制更具挑战性。不同的开发环境、测试环境、生产环境可能使用不同的数据库产品&#xff08;如开发用H2、测试用MySQL、生产用PostgreSQL&#xff09;&#xff0c;而传统的SQL脚本往往包含特定数据库的方言&#xf…...

从零到集群:基于Rocky Linux ARM64的虚拟化平台构建与自动化部署实战

1. 环境准备与基础配置 第一次接触ARM64架构的虚拟化平台搭建时&#xff0c;我踩过不少坑。不同于常见的x86环境&#xff0c;Rocky Linux ARM64在驱动支持和软件生态上有其特殊性。我们先从最基础的物理服务器配置说起。 假设你面前是一台刚拆封的ARM架构服务器&#xff0c;我…...

零下20度实测:国产SysMax PCAN FD在寒区标定中的稳定性与兼容性全记录

零下20度极限挑战&#xff1a;SysMax PCAN FD在寒区汽车电子标定中的实战全解析 当清晨的内蒙古满洲里气温骤降至-20℃&#xff0c;大多数电子设备早已进入"冬眠"状态&#xff0c;而我们的汽车电子标定工作却必须继续。在这个被称为"中国冷极"的地区&#…...

VRCT: 实现VRChat跨语言交流的实时翻译解决方案 | 全球玩家的无障碍社交工具

VRCT: 实现VRChat跨语言交流的实时翻译解决方案 | 全球玩家的无障碍社交工具 【免费下载链接】VRCT VRCT(VRChat Chatbox Translator & Transcription) 项目地址: https://gitcode.com/gh_mirrors/vr/VRCT 在全球化的虚拟社交平台VRChat中&#xff0c;语言障碍是否曾…...

【PCIE系列】深入解析接收端检测:从电路原理到实战验证

1. PCIE接收端检测机制的核心原理 当你把一根USB线插入电脑时&#xff0c;系统瞬间就能识别到设备连接——这种看似简单的操作背后&#xff0c;隐藏着PCIE接收端检测的精妙机制。作为硬件工程师&#xff0c;我经常需要调试这种看似简单实则复杂的链路检测问题。接收端检测本质上…...

告别重复造轮子:用快马AI一键生成Unity通用数据管理模块,提升开发效率

今天想和大家分享一个提升Unity开发效率的实用技巧——如何快速构建一个通用的游戏数据管理模块。这个模块可以帮我们告别重复造轮子的痛苦&#xff0c;把更多精力放在游戏核心玩法的开发上。 为什么需要通用数据管理模块 在Unity开发中&#xff0c;我们经常需要处理各种游戏数…...

告别‘纸片人’:用AAAI 2025最新技术,打造你的高保真3D数字分身(ID-Sculpt/GraphAvatar实战)

从单张照片到高保真3D数字分身&#xff1a;ID-Sculpt与GraphAvatar技术实战指南 在虚拟社交、直播互动和元宇宙场景爆发的今天&#xff0c;一个能准确还原个人特征的3D数字分身正在从技术炫技变成刚需。传统3D建模需要专业设备和数小时扫描&#xff0c;而最新AAAI 2025会议亮相…...

保姆级教程:用facenet-pytorch 0.3.0搭建人脸识别环境,CPU/GPU版本一键配置(附避坑清单)

从零构建facenet-pytorch人脸识别环境&#xff1a;CPU/GPU双版本全流程指南 第一次接触人脸识别项目时&#xff0c;最令人头疼的往往不是算法本身&#xff0c;而是环境配置这个"拦路虎"。不同硬件、不同CUDA版本、不同依赖库之间的兼容性问题&#xff0c;足以让新手…...