力扣面试150 添加与搜索单词 - 数据结构设计 字典树

news2024/11/17 2:28:46

Problem: 211. 添加与搜索单词 - 数据结构设计
在这里插入图片描述

👩‍🏫 参考题解

在这里插入图片描述

public class WordDictionary
{
    // 定义一个内部类 'Node',用于表示 Trie(前缀树)中的每个节点
    class Node
    {
        // 每个节点有一个大小为 26 的数组,分别对应字母表中的字母 ('a' 到 'z')
        Node[] tns = new Node[26];
        // 这个布尔值标记该节点是否代表一个单词的结尾
        boolean isWord;
    }

    // Trie 的根节点
    Node root = new Node();

    /**
     * 向 Trie 中添加一个单词
     * @param word 要添加的单词
     */
    public void addWord(String word)
    {
        // 从根节点开始
        Node p = root;
        // 遍历单词中的每个字符
        for (int i = 0; i < word.length(); i++)
        {
            // 获取当前字符对应的索引 ('a' 对应 0,'b' 对应 1,以此类推)
            int u = word.charAt(i) - 'a';
            // 如果当前节点的对应索引位置为 null,则创建一个新节点
            if (p.tns[u] == null)
                p.tns[u] = new Node();
            // 移动到下一个节点
            p = p.tns[u];
        }
        // 标记当前节点为一个完整单词的结尾
        p.isWord = true;
    }

    /**
     * 搜索 Trie 中是否存在与给定模式匹配的单词
     * @param word 要搜索的模式,模式中可以包含 '.' 作为任意字母的通配符
     * @return 如果存在与模式匹配的单词则返回 true,否则返回 false
     */
    public boolean search(String word)
    {
        // 从根节点开始深度优先搜索
        return dfs(root, word, 0);
    }

    /**
     * 深度优先搜索 (DFS) 辅助函数
     * @param p 当前节点
     * @param s 要匹配的字符串
     * @param sIdx 当前匹配到的字符串索引
     * @return 如果存在匹配的单词则返回 true,否则返回 false
     */
    private boolean dfs(Node p, String s, int sIdx)
    {
        // 获取字符串的长度
        int n = s.length();
        // 如果已经匹配到字符串的末尾,检查当前节点是否是一个单词的结尾
        if (n == sIdx)
            return p.isWord;
        
        // 获取当前要匹配的字符
        char c = s.charAt(sIdx);
        // 如果当前字符是 '.',则尝试匹配当前节点下的所有可能的分支
        if (c == '.')
        {
            // 遍历所有 26 个字母的节点
            for (int j = 0; j < 26; j++)
            {
                // 如果当前分支不为空,并且继续搜索能找到匹配的单词,则返回 true
                if (p.tns[j] != null && dfs(p.tns[j], s, sIdx + 1))
                    return true;
            }
            // 如果没有任何分支匹配,则返回 false
            return false;
        }
        // 如果当前字符不是 '.',则只匹配对应的字符节点
        else
        {
            // 获取字符对应的索引
            int u = c - 'a';
            // 如果对应的字符节点为空,说明没有匹配,返回 false
            if (p.tns[u] == null)
                return false;
            // 继续递归搜索下一个字符
            return dfs(p.tns[u], s, sIdx + 1);
        }
    }
}

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

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

相关文章

详解swoole框架快速入门

Swoole包含两个主要部分&#xff1a;一个是用C语言开发的PHP扩展&#xff0c;作为核心功能&#xff1b;另一个是通过PHP代码编写的框架&#xff0c;类似于yii、TP和Laravel。 Swoole扩展本身具备web服务器功能&#xff0c;可以取代php-fpm。当仅使用Swoole框架时&#xff0c;可…

国产人形机器人突破,教会人形机器人如何像人类一样移动

与远在大洋彼岸的特斯拉机器人使用相同的训练设备&#xff0c;Humanoid Robot(上海)有限公司正在使用Xsens动作捕捉系统和ai训练人形机器人模仿人类运动&#xff0c;执行复杂任务。 关键要点: 人形机器人市场正在快速扩张:人形机器人市场将在未来大幅增长&#xff0c;据统计数…

傅里叶变换的python实现

周期信号的频谱   为了能既方便又明白地表示一个信号在不同频率下的幅值和相位&#xff0c;可以采用成为频谱图的表示方法。   在傅里叶分析中&#xff0c;把各个分量的幅度|Fn|或 Cn 随着频率nω1的变化称为信号的幅度谱。   而把各个分量的相位 φn 随角频率 nω1 变化…

ZUploader 之 文件上传

文件上传是前端开发很常用的一个功能, 通常文件上传都是异于表单提交, 使用起来配置繁多, 校验不统一, 展示不统一。 效果对比 特点 简化使用数据双向绑定样式统一带预览和下载功能 依赖 封装的组件 FileViewDialog (文件预览与下载,不需要此功能的话,可删除) 文件返回接口…

用户体验分享 | YashanDB V23.2.3安装部署

近期崖山新版体验过程中&#xff0c;总能看到用户提问&#xff1a;openssl版本问题、monit命令找不到问题、yashan用户权限问题、数据库重装问题 今日整理了多位用户的安装经验&#xff0c;希望能够帮助到大家~ 1.Lucifer三思而后行 &#xff1a;YashanDB 个人版数据库安装部…

稳居赛道销量前三的制造业巨头:数据安全建设的高效实践

作为一家迅速扩展的全球化制造企业&#xff0c;我们的分支和业务遍布国内多个城市及海外&#xff0c;员工流动频繁&#xff0c;终端设备多样&#xff0c;研发流程复杂。因此&#xff0c;我们需要一个灵活且强大的数据安全策略。经过深入的市场调研和严格POC测试&#xff0c;我们…

使用Postman搞定各种接口token实战

现在许多项目都使用jwt来实现用户登录和数据权限&#xff0c;校验过用户的用户名和密码后&#xff0c;会向用户响应一段经过加密的token&#xff0c;在这段token中可能储存了数据权限等&#xff0c;在后期的访问中&#xff0c;需要携带这段token&#xff0c;后台解析这段token才…

虚拟机的安装和使用

一、虚拟机的简单介绍 虚拟机可以使你在一台机器上同时运行二个或更多Windows、LINUX等系统&#xff0c;它可以模拟一个标准PC环境。这个环境和真实的计算机一样&#xff0c;都有芯片组、CPU、内存、显卡、声卡、网卡、软驱、硬盘、光驱、串口、并口、USB控制器等。 二、虚拟机…

案例|高动态厘米级监测!广东这些长大桥有了北斗“守护者”

随着桥梁交通流量快速提升&#xff0c;加上受到恶劣使用环境、荷载作用、年限过长等因素影响&#xff0c;近年来&#xff0c;因桥梁损害引发的安全事故时有发生。伴随着传感设备、数字通讯网络、数据分析方法等新技术和新设备的发展&#xff0c;为桥梁管养提供了更多有效的检测…

09_行级锁的加锁流程

MySQL 的加锁流程 文章目录 MySQL 的加锁流程简介记录锁、间隙锁和临键锁概述行级锁加锁流程示例流程两个原则&#xff0c;两个优化&#xff0c;一个 BUG两个原则两个优化一个 BUG示例1-主键&#xff08;唯一&#xff09;索引示例 2-普通索引 总结 简介 在 MySQL InnoDB 存储引…

理解C语言之深入理解指针(三)

目录 1. 字符指针变量 2. 数组指针变量 2.1 数组指针变量是什么&#xff1f; 2.2 数组指针变量怎么初始化 3. ⼆维数组传参的本质 4. 函数指针变量 4.1 函数指针变量的创建 4.2 函数指针变量的使⽤ 4.3 两段有趣的代码 4.3.1 typedef 关键字 5. 函数指针数组 6. 转移…

Linux递归找出目录下最近被修改文件(最近一段时间内被修改过的最新文件)(最近修改文件、最新文件、查找文件)(监控目录、监控mysql文件)

文章目录 命令1&#xff1a;找出目录下最近60分钟内修改的最新文件命令解析&#xff1a; 命令2&#xff1a;找出目录下最近60分钟内修改的最新n个文件 命令1&#xff1a;找出目录下最近60分钟内修改的最新文件 find /ky_data/mysql -type f -mmin -60 -exec ls -ltr {} | tai…

【LeetCode每日一题】——LCP 51.烹饪料理

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 回溯 二【题目难度】 简单 三【题目编号】 LCP 51.烹饪料理 四【题目描述】 欢迎各位勇者来…

【工具分享】NoWay勒索病毒解密工具

前言 NoWay勒索软件首次出现在2023年&#xff0c;并迅速引起了网络安全领域的关注。它是一种典型的加密勒索软件&#xff0c;主要通过恶意电子邮件附件或不安全的下载链接传播。一旦成功感染系统&#xff0c;NoWay会加密受害者的文件&#xff0c;并要求支付赎金以恢复文件访问…

Redis(初步认识和安装)

初识Redis 认识NoSQLSQL结构化&#xff1a;structure关联的&#xff1a;RelationalSQL查询ACID NoSQL非结构化无关联的非SQLBASE 认识Redis安装Redis 认识NoSQL SQL和NoSQL比较 SQL 结构化&#xff1a;structure 数据库中表的字段都有固定的结构 关联的&#xff1a;Relati…

【c语言数据结构】栈的详解! 超级详细!(模拟实现,OJ练习题)

栈的概念&#xff1a; 栈&#xff1a;像是一种容器&#xff0c;东西只能从一个地方进&#xff0c;一个地方出&#xff0c;且后进先出&#xff01;这是其和队列&#xff08;先进先出&#xff0c;像排队一样&#xff0c;先到先得&#xff09;的本质区别 ⼀种特殊的线性表&#…

“JY901传感器“学习笔记

目录 一、产品概述 二、产品功能介绍 2.1、轴向说明 2.2、模块校准 2.3、姿态角 2.4、大地坐标系、地心地固坐标系、站心坐标系 三、参考文献 一、产品概述 模块集成高精度的陀螺仪、加速度计、地磁场传感器&#xff0c;采用高性能的微处理器和先进的动力解算与卡尔曼动…

两种不同方式实现交换机路由器的登录Console+Telnet的实现

一、背景及原理 1.Telnet 作为一种远程登录协议,1969年发明诞生于美国国防部高级研究计划局网络工作小组的研究员,Tenlet的出现为后续相关技术的发展奠定了基础。 2.Telnet通常用于远程登录应用中,对本地和远端进行网络设备配置、监控、维护,可以通过Telnet方式在一台设备…

博睿数据受邀亮相NebulaGraph Meetup北京站

9 月 21 日&#xff0c;北京站 nMeetup 如期而至&#xff0c;一场以 GraphRAG 和人工智能技术融合为主题的开发者聚会&#xff0c;在金秋的首都拉开帷幕。8 位讲师和 140 多位来自五湖四海的行业伙伴们相聚一堂&#xff0c;共同探讨 GraphRAG & AI 的最新发展和应用实践&am…

卷轴模式:一种新型的电子商务营销策略

随着电子商务行业的蓬勃发展&#xff0c;各类创新营销策略层出不穷&#xff0c;旨在吸引更多消费者并提升销售额。在这之中&#xff0c;卷轴模式以其独特的优势和可观的收益逐渐受到业界renxb001的关注。本文将深入探讨卷轴模式的概念、优势、应用场景以及如何参与其中。 卷轴…