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

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.mfbz.cn/a/882126.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#如何把写好的类编译成dll文件

1 新建一个类库项目 2 直接改写这个Class1.cs文件 3 记得要添加Windows.Forms引用 4 我直接把在别的项目中做好的cs文件搞到这里来&#xff0c;连文件名也改了&#xff08;FilesDirectory.cs&#xff09;&#xff0c;这里using System.Windows.Forms不会报错&#xff0c;因为前…

Spring Boot管理用户数据

目录 学习目标前言Thymeleaf 模板JSON 数据步骤 1: 创建 Spring Boot 项目使用 Spring Initializr 创建项目使用 IDE 创建项目 步骤 2: 添加依赖步骤 3: 创建 Controller步骤 4: 新建index页面步骤 5: 运行应用程序 表单提交步骤 1: 添加 Thymeleaf 依赖在 Maven 中添加依赖 步…

探索 ShellGPT:终端中的 AI 助手

文章目录 探索 ShellGPT&#xff1a;终端中的 AI 助手背景介绍ShellGPT 是什么&#xff1f;如何安装 ShellGPT&#xff1f;简单的库函数使用方法场景应用常见问题及解决方案总结 探索 ShellGPT&#xff1a;终端中的 AI 助手 背景介绍 在当今快速发展的技术领域&#xff0c;命…

Linux:用户账号管理和组账号管理

用户账号管理 账号控制总述 用户账户 作用: 1.可以登陆操作系统 2.不同的用户具备不同的权限 唯一标识&#xff1a;UID&#xff08;编号从0开始的编号&#xff0c;默认最大60000&#xff09;zhangsan(UID 1200) 管理员root的UID&#xff1a;永远为0 系统用户&#xff08;为程…

信息安全工程师(11)网络信息安全科技信息获取

一、信息获取的重要性 在网络安全领域&#xff0c;及时、准确地获取科技信息对于防范和应对网络威胁至关重要。这些信息可以帮助安全团队了解最新的攻击手段、漏洞信息、防护技术等&#xff0c;从而制定有效的安全策略和应对措施。 二、信息获取的来源 网络信息安全科技信息的获…

运行 xxxxApplication 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行。

一、问题描述 运行 xxxxApplication 时出错。命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行&#xff0c;然后重新运行。 二、问题分析 在idea中&#xff0c;运行一个springboot项目&#xff0c;在使用大量的库和依赖的时候&#xff0c;会出现报错“命令行过长”&…

一文读懂HPA弹性扩展自定义指标和缩放策略

一文读懂HPA弹性扩展自定义指标和缩放策略 目录 1 概念 1.1 什么是HPA1.2 HPA 的自定义指标&#xff08;Custom Metrics&#xff09;与扩展1.3 基于多指标的 HPA 1.3.1 工作原理1.3.2 例子&#xff1a;基于 CPU、内存和 QPS 的 HPA 配置 1.4 HPA 的扩缩容行为&#xff08;Beh…

带你0到1之QT编程:十八、最简单之TCP协议工作原理及实战编程

此为QT编程的第十八谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

OpenCV运动分析和目标跟踪(3)计算图像序列的加权平均值函数accumulateWeighted()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 更新一个运行平均值。 该函数计算输入图像 src 和累积器 dst 的加权和&#xff0c;使得 dst 成为帧序列的运行平均值&#xff1a; dst ( x , y…

git使用“保姆级”教程1——简介及配置项设置

一、git介绍 Git是一个开源的分布式版本控制系统&#xff0c;用于&#xff1a;敏捷高效地处理任何或小或大的项目。Git 是Linus Torvalds 为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。版本控制&#xff1a; 版本控制&#xff08;Revision control&#xff…

《概率论与数理统计》学渣笔记

文章目录 1 随机事件和概率1.1 古典概型求概率随机分配问题简单随机抽样问题 1.2 几何概型求概率1.3 重要公式求概率 2 一维随机变量及其分布2.1 随机变量及其分布函数的定义离散型随机变量及其概率分布&#xff08;概率分布&#xff09;连续型随机变量及其概率分布&#xff08…

【MYSQL】聚合查询、分组查询、联合查询

目录 聚合查询聚合函数count()sum()avg()max()和min()总结 分组查询group by 子句having 子句 联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询 合并查询 聚合查询 聚合查询就是针对表中行与行之间的查询。 聚合函数 count() count(列名)&a…

计算机网络笔记002

### 课堂讨论对话 **学生A**: 老师&#xff0c;计算机网络的组成是怎样的&#xff1f;&#x1f914; **老师**: 非常好的问题&#xff01;计算机网络主要由硬件、软件和通信协议三部分组成。我们先从硬件开始讨论吧。 **学生B**: 硬件包括哪些设备呢&#xff1f;&#x1f60…

【案例分享】智慧工地以及档案资料电子化

汇匠源分别在2020年和2023年与中国电建昆明院进行了项目合作&#xff0c;其中包括智慧工地的信息管理平台建设、数据录入、接口研发等&#xff1b;档案资料电子化的施工过程资料整理、归档等工作。 智慧工地 — 项目概况 — 项目名称&#xff1a;某JR项目智慧工地信息管理…

DriveMatriX Highway Dataset :高速公路驾驶数据集(猫脸码客 第196期)

DriveMatriX Highway Dataset 1.0&#xff1a;自动驾驶与ADAS感知验证的里程碑 在当今快速发展的自动驾驶&#xff08;AV&#xff09;和高级驾驶辅助系统&#xff08;ADAS&#xff09;领域&#xff0c;数据的获取与处理成为了推动技术进步的关键因素。为了在这些复杂且多变的交…

Allegro第二季度GMV增长11.1%,活跃买家突破2000万

9月19日&#xff0c;波兰电商巨头Allegro公布了2024年第二季度财报。第二季度&#xff0c;Allegro的商品交易总额&#xff08;GMV&#xff09;同比增长11.1%&#xff0c;调整后EBITDA同比增长31.5%&#xff0c;均好于预期。 财报显示&#xff0c;Allegro各区域活跃买家数量超过…

java日志框架之Log4j

文章目录 一、Log4j简介二、Log4j组件介绍1、Loggers (日志记录器)2、Appenders&#xff08;输出控制器&#xff09;3、Layout&#xff08;日志格式化器&#xff09; 三、Log4j快速入门四、Log4j自定义配置文件输出日志1、输出到控制台2、输出到文件3、输出到数据库 五、Log4j自…

学习记录:js算法(四十二): 寻找两个正序数组的中位数

文章目录 寻找两个正序数组的中位数我的思路网上思路 总结 寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], n…

Transformer推理结构简析(Decoder + MHA)

一、Transformer 基本结构 Transformer由encoder和decoder组成&#xff0c;其中&#xff1a; encoder主要负责理解&#xff08;understanding&#xff09; The encoder’s role is to generate a rich representation (embedding) of the input sequence, which the decoder c…

【深度学习】(5)--搭建卷积神经网络

文章目录 搭建卷积神经网络一、数据预处理1. 下载数据集2. 创建DataLoader&#xff08;数据加载器&#xff09; 二、搭建神经网络三、训练数据四、优化模型 总结 搭建卷积神经网络 一、数据预处理 1. 下载数据集 在PyTorch中&#xff0c;有许多封装了很多与图像相关的模型、…