LeetCode 算法:实现 Trie (前缀树) c++

原题链接🔗:实现 Trie (前缀树)
难度:中等⭐️⭐️

题目

Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

请你实现 Trie 类:

  • Trie() 初始化前缀树对象。
  • void insert(String word) 向前缀树中插入字符串 word
  • boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false
  • boolean startsWith(String prefix) 如果之前已经插入的字符串 word的前缀之一为 prefix ,返回 true ;否则,返回false

示例:

输入
[“Trie”, “insert”, “search”, “search”, “startsWith”, “insert”, “search”]
[[], [“apple”], [“apple”], [“app”], [“app”], [“app”], [“app”]]
输出
[null, null, true, false, true, null, true]

解释
Trie trie = new Trie();
trie.insert(“apple”);
trie.search(“apple”); // 返回 True
trie.search(“app”); // 返回 False
trie.startsWith(“app”); // 返回 True
trie.insert(“app”);
trie.search(“app”); // 返回 True

提示:

  • 1 <= word.length, prefix.length <= 2000
  • word 和 prefix 仅由小写英文字母组成
  • insert、search 和 startsWith 调用次数 总计 不超过 3 * 104

前缀树

前缀树,又称Trie树(发音为“try”),是一种用于存储字符串集合的数据结构,它允许快速检索和插入字符串,以及对字符串前缀的查询。前缀树的每个节点代表一个字符串的前缀,并且每个节点的子节点代表在该前缀基础上增加一个字符的所有可能的扩展。

  • 前缀树的特点
    • 空间效率:对于有大量公共前缀的字符串集合,前缀树可以节省存储空间。
    • 时间效率:插入和搜索操作的时间复杂度通常为O(m),其中m是字符串的长度。
    • 动态集合:前缀树可以动态地插入和删除字符串,适用于需要频繁更新的场景。
  • 前缀树的基本操作
    • 插入:将一个字符串插入树中,从根节点开始,逐字符向下,如果字符对应的子节点不存在,则创建新节点。
    • 搜索:搜索一个字符串是否存在于树中,从根节点开始,逐字符向下,如果某个字符的子节点不存在,则搜索失败。
    • 前缀搜索:检查是否存在以某个字符串为前缀的任何字符串,与搜索操作类似,但不需要检查最后一个节点的结束标志。
    • 删除:从树中删除一个字符串,需要递归地删除节点,同时确保不删除其他字符串的公共前缀节点。
  • 前缀树的应用场景
    • 自动补全:在搜索引擎或文本编辑器中,根据用户输入的前缀快速提供补全建议。
    • 拼写检查:检查用户输入的单词是否拼写正确,并提供正确的拼写建议。
    • IP路由:在网络中,使用最长前缀匹配来确定数据包的路由路径。
    • 基因序列分析:在生物信息学中,用于快速匹配和检索基因序列。

题解

  1. 解题思路

Trie(前缀树)是一种用于快速检索字符串数据集中的键的树形数据结构。它是一种特殊的树,其中每个节点代表一个字符,并且从根到某一节点的路径表示一个字符串。Trie树常用于实现自动补全、拼写检查等功能。

以下是实现Trie树的基本步骤和解题思路:

  1. 定义Trie节点

    • 每个Trie节点通常包含一个字符集合或一个布尔值来表示单词的结束,以及指向子节点的指针。
  2. 初始化Trie

    • 创建一个根节点,它不包含任何字符,但可以作为所有单词的起点。
  3. 插入操作

    • 从根节点开始,对于要插入的字符串中的每个字符:
      • 如果字符对应的子节点不存在,则创建一个新的子节点。
      • 将当前节点移动到对应的子节点。
  4. 搜索操作

    • 从根节点开始,对于要搜索的字符串中的每个字符:
      • 如果字符对应的子节点存在,则继续搜索。
      • 如果不存在,则返回搜索失败。
  5. 前缀搜索

    • 类似于搜索操作,但是只关心字符串的前缀是否存在。
  6. 删除操作(可选):

    • 根据需要实现删除单词的功能,这通常涉及到删除节点,并且需要处理节点的引用计数。
  7. 自动补全功能(可选):

    • 给定一个前缀,返回所有以该前缀开始的字符串。
  1. c++ demo
#include <iostream>
#include <string>
#include <unordered_map>using namespace std;class Trie {
private:vector<Trie*> children;bool isEnd;Trie* searchPrefix(string prefix) {Trie* node = this;for (char ch : prefix) {ch -= 'a';if (node->children[ch] == nullptr) {return nullptr;}node = node->children[ch];}return node;}public:Trie() : children(26), isEnd(false) {}void insert(string word) {Trie* node = this;for (char ch : word) {ch -= 'a';if (node->children[ch] == nullptr) {node->children[ch] = new Trie();}node = node->children[ch];}node->isEnd = true;}bool search(string word) {Trie* node = this->searchPrefix(word);return node != nullptr && node->isEnd;}bool startsWith(string prefix) {return this->searchPrefix(prefix) != nullptr;}
};int main() {Trie trie;trie.insert("apple");std::cout << trie.search("apple") << std::endl;   // 返回 1std::cout << trie.search("app") << std::endl;     // 返回 0std::cout << trie.startsWith("app") << std::endl; // 返回 1return 0;
}
  • 输出结果:

1
0
1

  1. 代码仓库地址:Trie

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

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

相关文章

关于C# 开发Winfrom事后总结

一&#xff1a;要求能读取文件夹中视频及图片并判断 private void Form1_Load(object sender, EventArgs e){string foldPath "路径";//获取该目录下的文件 string[] files Directory.GetFiles(foldPath "\\", "*.*", System.IO.SearchOption…

Linux编程第三篇:Linux简介,开源软件简介(Linux是否安全?参考TESEC指标)

业精于勤荒于嬉&#xff0c;行成于思毁于随。 今天这篇算是Linux的正式学习&#xff0c;废话不多说&#xff0c;我们开始吧 第三篇 一、UNIX与Linux发展史1.1、UNIX发展历史和发行版本1.2、UNIX主要发行版本1.3、Linux发展历史1.4、Linux内核版本1.5、Linux主要发行版本 二、开…

渐变且描边文字

效果&#xff1a; 用 background-image&#xff1a;linear-gradient实现渐变、 text-shadow实现描边 元素同时添加&#xff1a; background-image: linear-gradient(to bottom, rgba(255, 255, 255, 1), rgba(143, 180, 253, 1));-webkit-background-clip: text;background-…

大整数加法C++

大整数加法C 方法代码 方法 小的数在前&#xff0c;大数在后加数、被加数进行翻转&#xff0c;从低位开始加起&#xff0c;因为数组是从0位开始&#xff0c;与正常手工加法不同。设置进位符carry_flag先对小的数进行控制&#xff0c;做加法再对大的数剩下的部分&#xff0c;做…

Spring支持人工智能应用框架-SpringAi

简介 人工智能技术和日益成熟&#xff0c;开发企业级人工智能的应用已成为一个热门的趋势。Spring AI 是一个用于 AI 工程的应用框架&#xff0c;目的是为了简化AI应用的对接、部署、维护和扩展。 SpringAi的灵感来自LangChain和LlamaIndex&#xff0c;但是SpringAi并不是直接…

Python实现动态迷宫生成:自动生成迷宫的动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame定义迷宫生成类主循环 完整代码 引言 迷宫生成算法在游戏开发和图形学中有着广泛的应用。它不仅可以用于创建迷宫游戏&#xff0c;还可以用于生成有趣的图案。在这篇博客中&#xff0c;我们将使用Python…

一文了解java中Optional

文章目录 1. Optional简介2. 常用的接口2.1 常用接口简单使用2.1.1 创建的常用方法2.1.2 获取值的常用方法2.1.3 判定的常用方法2.1.4 判定后的操作方法2.2 map方法介绍 2.2 其他方法2.2.1 Filter 方法2.2.2 FlatMap 方法 3. 常用的实例4. 总结 1. Optional简介 Optional是在ja…

基于Java的校园交友网站系统

你好&#xff0c;我是专注于计算机技术研究的学姐码农小野。如果你对校园交友网站系统的构建或者相关技术感兴趣&#xff0c;欢迎私信交流。 开发语言 Java 数据库 MySQL 技术 Java语言、SpringBoot框架、B/S结构 工具 MyEclipse、Navicat、Maven 系统展示 首页 个人…

Postman:Body类型中的x-www-from-urlencoded参数可以接受GET请求吗?

不可以 今天学习Spring Web MVC&#xff0c;在借助Postman学习 RequestMapping 注解时&#xff0c;发现Body类型中的x-www-from-urlencoded参数不支持GET请求。 按理说 RequestMapping 注解可以支持全部类型的请求&#xff0c;但为何在这里不能支持GET请求呢&#xff1f; 以下是…

Diffusion 加速系列之三 | LCM

0. 资源链接 论文: LCM&#xff1a;https://arxiv.org/abs/2310.04378 项目: https://github.com/luosiallen/latent-consistency-model 1. 背景动机 现有的高分辨率的 diffusion 模型推理存在的问题&#xff1a; Diffusion 模型推理过程包含多步去噪的流程&#xff0c;这会…

VMware虚拟机使用标准分区后对分区进行扩容

前言&#xff1a; 使用虚拟机创建系统后&#xff0c;/ 盘 想要扩容需要几步才能实现&#xff0c;下面将介绍具体流程 确定根分区磁盘以及分区号&#xff0c;和起始扇区和结束扇区 # 查看磁盘名称和分区 # 如下可看出根分区为 /dev/sda2 &#xff0c;磁盘为sda [root192 ~]# ls…

【鸿蒙学习笔记】元服务

官方文档&#xff1a;元服务规格 目录标题 什么是元服务特征第一个元服务-案例介绍创建项目源码启动模拟器启动entry创建卡片出发元服务 什么是元服务 特征 免安装分包预加载老化和更新机制 第一个元服务-案例介绍 创建项目 源码 Entry Component struct WidgetCard {buil…

qt 线程举例

qt 线程举例 在Qt中&#xff0c;使用线程的一个常见方式是通过QThread类。下面是一个简单的例子&#xff0c;展示了如何创建一个线程并在其中执行任务。 步骤 1: 创建一个Worker类 首先&#xff0c;创建一个继承自QObject的Worker类&#xff0c;这个类将包含要在线程中执行的…

three完全开源扩展案例02-跳动的音乐

更多案例尽在https://threelab.cn/ 演示地址 import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";let mediaElement; let analyser; let scene; let camera; let renderer; let controls; …

RabbitMQ中常用的三种交换机【Fanout、Direct、Topic】

目录 1、引入 2、Fanout交换机 案例&#xff1a;利用SpringAMQP演示Fanout交换机的使用 3、Direct交换机 案例&#xff1a;利用SpringAMQP演示Direct交换机的使用 4、Topic交换机 案例&#xff1a;利用SpringAMQP演示Topic交换机的使用 1、引入 真实的生产环境都会经过e…

1. openstack

openstack 一、云的简介1、优势2、类型2.1 根据提供的服务范围2.2 根据提供服务不同 二、openstack核心组件1、核心组件2、nova组件2.1 nova核心进程 3、glance组件4、cinder组件5、neutron组件6、swift组件7、cellometer组件8、keystone组件9、heat组件10、dashboard 一、云的…

大模型/NLP/算法面试题总结9——从普通注意力换成多头注意力会导致参数暴涨吗?

从普通注意力换成多头注意力&#xff08;Multi-Head Attention&#xff09;&#xff0c;通常不会导致参数总量暴涨。相反&#xff0c;在某些实现和配置下&#xff0c;参数量的增加可能相对可控&#xff0c;甚至在某些情况下&#xff0c;通过优化可以实现参数量的有效控制。 参…

韦东山嵌入式linux系列-LED 驱动程序框架

1 回顾字符设备驱动程序框架 图中驱动层访问硬件外设寄存器依靠的是 ioremap 函数去映射到寄存器地址&#xff0c;然后开始控制寄存器。 那么该如何编写驱动程序&#xff1f; ① 确定主设备号&#xff0c;也可以让内核分配&#xff1b;② 定义自己的 file_operations 结构体&…

编程开发语言跨平台、无缝升级才是大势所趋

编程语言的兼容性 编程语言的新特性升级&#xff0c;导致对原有项目环境不能直接使用最新版本的功能。 举个例子&#xff1a;比如PHP语言 PHP5.* 系 、 PHP7.*系 、 PHP8.*系 低版本向高版本升级更多的操作是&#xff1a;兼容性检查 在升级之前&#xff0c;应该确保项目…

【LeetCode:1071. 字符串的最大公因子 + 模拟 + 最大公约数】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…