首页 > 其他分享 >实现 Trie (前缀树)(字典树)

实现 Trie (前缀树)(字典树)

时间:2024-12-29 15:21:24浏览次数:1  
标签:search word 前缀 Trie 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

 

思路:

Trie,又称前缀树或字典树,是一棵有根树,其每个节点包含以下字段:

  • 指向子节点的指针数组 children。对于本题而言,数组长度为 26,即小写英文字母的数量。此时 children[0] 对应小写字母 a,children[1] 对应小写字母 b,…,children[25] 对应小写字母 z。
  • 布尔字段 isEnd,表示该节点是否为字符串的结尾。

插入字符串

我们从字典树的根开始,插入字符串。对于当前字符对应的子节点,有两种情况:

子节点存在。沿着指针移动到子节点,继续处理下一个字符。
子节点不存在。创建一个新的子节点,记录在 children 数组的对应位置上,然后沿着指针移动到子节点,继续搜索下一个字符。
重复以上步骤,直到处理字符串的最后一个字符,然后将当前节点标记为字符串的结尾。

查找前缀

我们从字典树的根开始,查找前缀。对于当前字符对应的子节点,有两种情况:

子节点存在。沿着指针移动到子节点,继续搜索下一个字符。
子节点不存在。说明字典树中不包含该前缀,返回空指针。
重复以上步骤,直到返回空指针或搜索完前缀的最后一个字符。

若搜索到了前缀的末尾,就说明字典树中存在该前缀。此外,若前缀末尾对应节点的 isEnd 为真,则说明字典树中存在该字符串。

原文链接:https://leetcode.cn/problems/implement-trie-prefix-tree/solutions/717239/shi-xian-trie-qian-zhui-shu-by-leetcode-ti500/

class Trie {
    Trie *child[26];
    bool isWord;
public:
    Trie() {
        isWord = false;
        for(int i=0;i<26;i++){
            child[i] = nullptr;
        }
    }
    
    void insert(string word) {
        Trie *t = this;
        for(int i=0;i<word.size();i++){
            if(!t->child[word[i]-'a']){
                t->child[word[i]-'a'] = new Trie();
            }
            t = t->child[word[i]-'a'];
        }
        t->isWord = true;
    }
    
    bool search(string word) {
        Trie *t = this;
        for(int i=0;i<word.size();i++){
            if(!t->child[word[i]-'a']){
                return false;
            }
            t = t->child[word[i]-'a'];
        }
        return t->isWord;
    }
    
    bool startsWith(string prefix) {
        Trie *t = this;
        for(int i=0;i<prefix.size();i++){
            if(!t->child[prefix[i]-'a']){
                return false;
            }
            t = t->child[prefix[i]-'a'];
        }
        return true;
    }
};

/**
 * Your Trie object will be instantiated and called as such:
 * Trie* obj = new Trie();
 * obj->insert(word);
 * bool param_2 = obj->search(word);
 * bool param_3 = obj->startsWith(prefix);
 */

 

标签:search,word,前缀,Trie,trie,节点,字典
From: https://www.cnblogs.com/yueshengd/p/18638921

相关文章

  • 【算法一周目】从时光的边缘看世界:前缀和揭示的算法真谛
    文章目录1.一维前缀和2.二维前缀和3.寻找数组的中心下标4.除自身以外数组的乘积5.和为k的子数组6.和可被k整除的子数组7.连续数组8.矩阵区域和1.一维前缀和题目链接:【模板】一维前缀和题目描述:给定一个长度为n的整数数组arr和q个查询,每个查询由两个整数l......
  • Python学习_元组和字典
    元组1.基础元组:不能被修改和删除,所以就提高了代码编写的安全性#元组的特性:不能够被修改,不支持删除#元组的定义:元素由小括号包围,每个元素之间用逗号隔开如(1,2,3)#验证元组不能被修改num_list=(10,20,30)print(num_list[0])#10num_list[0]=100#......
  • 构建多代理检索增强生成(Multi-Agent Retrieval-Augmented Generation)系统
    在当今快速发展的AI领域中,多代理检索增强生成(Multi-AgentRetrieval-AugmentedGeneration,简称多代理RAG)(面向企业RAG(RetrievalAugmentedGeneration)系统的多维检索框架)系统作为一种革命性的架构,正在企业级应用中崭露头角。多智能体RAG系统作为一种创新架构,为企业构建高效......
  • Java用本地字典数据库实现英语单词翻译
    Java用本地字典数据库实现英语单词翻译依赖的准备<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="h......
  • zshrc中的(eval) 前缀是什么?
    在我的配置文件中有这样几行配置:#python-click<8.0eval"$(_PYMOBILEDEVICE3_COMPLETE=source_zshpymobiledevice3)"#python-click>=8.0eval"$(_PYMOBILEDEVICE3_COMPLETE=zsh_sourcepymobiledevice3)"这几行配置的作用是在 Zsh中使用pymobiledevice3命令的参数......
  • 如何创建自定义Retriever
    技术背景介绍老铁们,今天我们来聊聊在LLM应用中如何创建一个自定义的Retriever。很多时候,我们需要从外部数据源中检索信息,一个好的Retriever就是帮我们完成这个任务的关键。Retriever的任务是根据用户的查询来检索相应的Document,然后将这些文档格式化为提示信息,传递给LLM进......
  • [学习笔记] 字典树
    https://blog.csdn.net/qq_49688477/article/details/118879270字典树图文详解就是根据“查字典”的思想使用c++实现罢了。比如要查一个单词\(\texttt{fAKe}\),先在根节点中查找\(\texttt{f}\),找不到则没有这个单词。找到了就来到\(\texttt{f}\)的节点往下查找\(\texttt{......
  • 用pandas导入含嵌套字典的json文件至mysql数据库
    需要导入的文件格式如下,要把data-diff数组里的所有元素导进去,对于某些json文件还需要添加日期字段。{"rc":0, "rt":6, "data":{ "total":197, "diff":[ { "f1":1, "f2":295.5, "f3":{"f4":......
  • 前缀和与差分
    前缀和与差分1.一维前缀和在学习前缀和之前,我们先来看一个题目,了解前缀和的用处。链接:题目链接题目描述给定一个数组a,有q次询问,对于每次询问:给定两个数l,r。求第l个数到第r个数的和。输入描述第一行一个整数表示样例个数T,1<=T<=10。对于每组样例:第一行两个整数n,q......
  • USACO24DEC Cake Game S 题解 [ 黄 ] [ 前缀和 ] [ adhoc ]
    CakeGame:小清新前缀和题,但是我场上想了半天优先队列贪心假完了/ll/ll/ll。观察本题有三个重要的结论,我们依次进行观察。不难发现,第二个牛一定会拿\(\frac{n}{2}-1\)个蛋糕走。同时它拿走的蛋糕一定是左边一段、右边一段。如果它要使自己的分数最大化,那么显然就是要将左边和......