212 单词搜索II

leetcode: 212. 单词搜索II 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。, 返回所有二维网格上的单词。来源:力扣(LeetCode)单词必须按照字母顺序,通过。和一个单词(字符串)列表。 阅读详情

思路:

先将单词插入到前缀树中,然后再DFS一步步去判断下一个要遍历的字符是否存在前缀树中,若存在,则加入中间变量中,若当前遍历的字符序列在字典树中组成一个单词,则加入ans中

不存在,则停止该方向的搜索,因为前缀不存在,则后面DFS生成的单词均以此为前缀,均不存在

在DFS时使用一个set来保存存在于前缀树中的单词,因为遍历时可能会有重复的单词加入,注意DFS时对于vis数组和中间变量的重置。

最后将自动排序好的set转为vector作为ans返回即可。

class Trie
{
public:
    bool is_end;
    Trie *next[26]; // 单词在a - z之间
    Trie()
    {
        is_end = false;
        for(int i = 0; i < 26; ++i) next[i] = nullptr;
    }

    void insert(const string& word)
    {
        Trie *t = this;
        for(auto i : word)
        {
            if(t->next[i - 'a'] == nullptr) t->next[i - 'a'] = new Trie();
            t = t->next[i - 'a'];
        }
        t->is_end = true;
    }
};

class Solution {
    Trie *root;
    int row, col;
    int dx[4] = {0, -1, 0, 1}, dy[4] = {1, 0, -1, 0};
    set<string> aws; // 暂存遍历时的存在的单词,可能会有重复元素,去重用set
    string temp; // 用来存储遍历时生成的中间字符串
    vector<vector<bool>> vis; // 标记是否访问过
public:
    Solution(){root = new Trie();}

    void DFS(int i, int j, const vector<vector<char>>& board, const Trie *t)
    {
        char c = board[i][j];
        printf("%c", c);
        temp.push_back(c);
        if(t->next[c - 'a'] == nullptr)
        {
            temp.pop_back();
            // 每次生成字符串时不能访问这次已经访问过的点,但是下一次开始时能访问与上一次重复的点,要重置vis
            vis[i][j] = false;
            return;
        }
        vis[i][j] = true;
        if(t->next[c - 'a']->is_end == true) aws.insert(temp); // 组成前缀树中的一个单词
        for(int k = 0; k < 4; ++k)
        {
            int I = dx[k] + i, J = dy[k] + j;
            if(I >= 0 && I < row && J >= 0 && J < col && vis[I][J] == false)
                DFS(I, J, board, t->next[c - 'a']);
        }
        // 运行到这里重置vis和temp
        vis[i][j] = false;
        temp.pop_back();
    }

    vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
        for(auto s : words) root->insert(s); // 先将单词插入到前缀树中
        row = board.size(), col = board[0].size();
        vis.resize(row);
        for(int i = 0; i < row; ++i)
        {
            vis[i].resize(col);
            fill(vis[i].begin(), vis[i].end(), false);
        }
        for(int i = 0; i < row; ++i) // 对整个图DFS
            for(int j = 0; j < col; ++j)
                DFS(i, j, board, root);
        vector<string> ans(aws.begin(), aws.end()); // set转换为vector
        return ans;
    }
};
ESP32搭配LVGL显示图片的两种方法详解:内部存储 vs 外部文件 本文详细介绍了ESP32搭配LVGL显示图片的两种方法:内部存储与外部文件。内部存储方案适合快速响应的小图片,而外部文件方案则适用于需要灵活更新和大容量图片的场景。通过对比分析,帮助开发者根据项目需求选择最优方案,提升嵌入式系统的UI性能。 阅读详情

相关推荐

生成式引擎优化(GEO)- 搜索引擎优化

生成式引擎优化(GEO)是针对AI内容生成平台(如ChatGPT)的新型优化策略,旨在提升品牌内容在AI生成答案中的引用率,与传统SEO存在显著差异。GEO通过优化内容权威性、结构化和语义关联,适应AI的RAG技术架构,采用3C原则(可爬性、网络共识、反馈校正)提升内容可见性。其核心区别在于目标(引用率vs排名)、技术(语义优化vs关键词)及算法透明度(封闭vs开放)。适用场景包括商业决策、行业权威建设及公共知识服务,帮助品牌在AI时代占据信息主导权。

解锁AI流量新红利!🚀 GEO优化(生成引擎优化)助您掌控AI搜索,让AI成为您的品牌最佳代言人! 1399

LeetCode 212. 单词搜索 II(Word Search II)

LeetCode 212. 单词搜索 II(Word Search II) 题目的????:3082 在这里插入代码片 题目的????:130 1、问题描述 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 示例: 输入: words = ["oath","pea","eat","ra

botke的博客 490

Curve+ 5.0.2:新一代色彩校准工具如何革新印刷行业标准

Curve+ 5.0.2作为新一代色彩校准工具,通过G7+校准算法和SCTV技术革新了印刷行业的色彩管理标准。该工具显著提升色彩精准度,减少打样时间和材料浪费,支持专色处理,实现跨材质色彩一致性,为印刷企业带来效率与质量的全面提升。

weixin_29228781的博客 529

LeetCode-212. 单词搜索 II

给定一个m x n 二维字符网格board和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 示例 1: 输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], words = ...

保持对编程的热情! 250

纽马克-贝塔法(Newmark-Beta Method)在结构动力学中的应用与实现

本文深入解析了纽马克-贝塔法(Newmark-Beta Method)在结构动力学数值计算中的核心原理与应用。作为经典的时间积分算法,它通过调节γ和β参数,在计算精度、稳定性与效率间取得平衡,尤其适用于地震响应、风振分析等工程场景。文章详细阐述了其数学内核、在有限元分析中的实现步骤,并对比了隐式与显式方案的适用场景,为工程师提供了关键的方法选择与参数调优指导。

weixin_29232121的博客 148

波束管理 Beam Management

Beam Management in 5G NR   波束管理,是5G NR中基于信道质量来动态选择每个UE和gNB之间以什么方向和频率的波束beam来进行通信。   背景   5G NR(New Radio)支持非常高的数据速率和更低的延迟。5G NR支持FR1和FR2频段,FR1为亚6 GHz(450至6000 MHz);FR2为毫米波段(24.25 GHz至52.6 GHz)。   由于毫米波频带使用非常高的频率,因此会导致传播损耗和其他损耗。为了补偿损失,在这种频率下定向通信是必不可少的。

最忆是江南的博客 5826

LeetCode 212:单词搜索 II

在中,找出所有能通过构成的单词(单词来自给定列表,每个单元格只能用一次)。

m0_75126572的博客 961

使用python读取卫星测高数据并做相应的处理

5.在python处理结果如下,最大的优点就是比matlab快30-40倍。4.进行粗差的如NaN值,还有进行3倍方差进行对粗差处理。1.首先遍历卫星数据的文件,挨个读取每个数据。有问题,请各位读者及时告知,一起完善内容。3.进行下一步,筛选在研究区域的数据。4.进行按天求平均和按月求平均。2.读取数据主体代码。

爱下去更难! 1133

212. 单词搜索 II【 力扣(LeetCode) 】

题目要求在给定的二维字符网格 board 中查找所有存在于单词列表 words 中的单词。单词必须通过相邻单元格的字母构成,且每个单元格的字母只能使用一次。解题思路是利用字典树(Trie)对深度优先搜索(DFS)进行剪枝优化。

yyh520025的博客 2139

【Fluent】太阳辐射模型—Solar Ray Tracing

一、引言Fluent提供了一个太阳能负载模型,可用于计算进入计算域的太阳光线的辐射效应。该模型可以分为:太阳光线追踪和太阳辐照。其中太阳辐照需要使用DO或MC模型,直接向辐射模型提供外光束方向和强度参数。太阳光线追踪不限制辐射模型,可以独立于辐射方程使用,甚至可以在辐射模型off的情况下使用。本文主要介绍太阳光线追踪模型。该模型非常适用于以下领域汽车气候控制 (ACC) 应用建筑物中的人体热舒适建模应用该模型使用着色算法进行太阳光线追踪。光线会透过半透明的面加载在照射面上。

a5567899的博客 7588

基于STM32的便携式心率血氧监测系统 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了便携式心率血氧监测系统的全功能开发,覆盖MAX30102光电传感器驱动、PPG信号处理、心率血氧解算算法、人机交互、数据存储、报警保护、低功耗管理等核心功能,全程采用无跳步保姆式教学,从硬件选型、接线、CubeMX配置、代码开发、调试优化全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 767

212. 单词搜索 II 力扣 c++

在 dfs 中,程序首先判断当前字符是否是 ‘#’ 或者 Trie 树中不存在以该字符为前缀的单词,如果是则立即返回。如果 Trie 树中存在以该前缀为结尾的单词,则将该单词加入到结果集合中,并将 Trie 树中对应的标记 isEnd 置为 false。然后按行遍历二维字符数组,对每个位置进行深度优先搜索,直到 Trie 树中存在一个对应的单词前缀,或者无法在 Trie 树中继续搜索。如果存在对应的单词前缀,则继续在四个方向上继续搜索,并将搜到的单词保存在结果向量中。定义了一个 TrieNode 结构体。

qq_41452177的博客 228

[SoC]SoC验证中bootcode与firmware相关验证经验总结

本文总结了SoC验证中bootcode和firmware的验证经验。重点介绍了两种数据加载方法:1)使用Verilog系统函数$readmemh/$readmemb直接写入ROM/ARAM,需注意文件路径、格式和斜杠方向;2)通过Memory Hierarchy在initial块中操作,需要添加适当延时并注意路径拼接。文章还提供了在testcase phase中先读取数据到HASH再写入SRAM的示例,并强调加载后需使能edc_bypass以避免ECC错误。验证过程中需特别注意文件位置、格式要求及路径处理等

元直的博客 2497

Java实现 LeetCode 212 单词搜索 II(二)

212. 单词搜索 II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 示例: 输入: words = ["oath","pea","eat","rain"] and board ...

南 墙 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java实现 LeetCode 212 单词搜索 II

public class Find2 { public int[] dx={1,-1,0,0}; public int[] dy={0,0,1,-1}; class Trie{ Trie[] tries; String isEnd; public Trie(){ tries = new Trie[26]...

南 墙 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LeetCode 212: 单词搜索 II

目录LeetCode 212: 单词搜索 II题目描述解题 LeetCode 212: 单词搜索 II 题目描述 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 示例: 输入: words = [“oath”,“pea”,“eat”,“rain”] and board = [ [‘o’,‘a

s_Shune 177

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

leetcode-212-单词搜索 II-java

题目及测试 package pid212; import java.util.List; /*单词搜索 II 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 示例: ...

今天吃了吗的博客 248

【小白爬Leetcode212】单词搜索II Word SearchII

【小白爬Leetcode212】单词搜索II Word SearchII 题目Discription分析思路 Trie树+DFS回溯改进: Leetcode212 hard\color{#FF0000}{hard}hard 点击进入原题链接:单词搜索II Word SearchII 相关题目:单词搜索 Word Search 【tag】 回溯搜索,字典树 题目 Discription Given a 2D board and a list of words from the dictionary, f

weixin_41604040的博客 328

Leetcode 212. 单词搜索 II C++

Leetcode 212. 单词搜索 II 题目 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 示例: 输入: words = ["oath","pea","eat","rain"] and board = [ ['o','a','a','n'], ['e','t','a','e'

weixin_43750513的博客 323

LeetCode第212题_单词搜索II

LeetCode第212题“单词搜索 II”要求在一个二维字符网格中找到所有出现在给定单词列表中的单词。单词必须通过相邻单元格的字母构成,且每个单元格的字母只能使用一次。该题难度为困难,解题思路主要结合Trie(前缀树)和深度优先搜索(DFS)来优化搜索过程。首先,构建Trie树存储所有单词,然后遍历网格中的每个单元格,以每个单元格为起点进行DFS搜索,同时在Trie树上移动,确保当前路径是某个单词的前缀。当找到单词时,将其加入结果集,并避免重复添加。通过Trie树的快速前缀匹配和DFS的路径搜索,能够有效

qq_40263592的博客 778

LeetCode第212题单词搜索 II

212. 单词搜索 II 题目: 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 示例 1: 输入:board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]], w

qq_41967623的博客 635

LeetCode 212. 单词搜索 II

LeetCode 212. 单词搜索 II。 前缀树 + dfs

qq_45925322的博客 135

扣第212题“单词搜索 II”

本文详细解读了力扣第212题“单词搜索 II”,通过使用前缀树和回溯法的方法高效地解决了这一问题,并提供了详细的解释和模拟面试问答。希望读者通过本文的学习,能够在力扣刷题的过程中更加得心应手。

10年数据\经营分析经验,现任大厂数据分析负责人 1132

[LeetCode] 212、单词搜索 II

题目描述 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 示例: 输入: words = ["oath","pea","eat","rain"] and board = [ [...

aift的专栏 244

【LeetCode】212. 单词搜索 II

一、题目 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。 示例: 输入: words = ["oath","pea","eat","rain"] and board = [ ['o','a','a','n'], ['e','t','a','e'], ['i','h','k','r

HeavenDan的博客 345

LeetCode 第212题:单词搜索 II

Trie树构建:我们使用Trie树来存储所有需要查找的单词,这样可以高效地进行前缀匹配。深度优先搜索(DFS):在二维网格中,从每个字符开始进行DFS,以查找可能的单词。标记访问:在DFS过程中,将已经访问过的字符标记为特殊符号(如),以避免重复使用。方向搜索:对每个字符进行上下左右四个方向的递归搜索,探索所有可能的路径。结果去重:如果在DFS过程中找到一个完整的单词,将其加入结果列表,并在Trie树中标记为已找到,以防重复加入。恢复状态:在DFS结束后,恢复网格中字符的原始状态,以便其他路径的搜索。

byteinit的专栏 423
上一篇: 211 添加与搜索单词
下一篇: 307 区域和检索
UnendingGlory
博客等级 码龄9年 55粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值