首页 > 其他分享 >208. 实现 Trie (前缀树)||Trie字典树模板

208. 实现 Trie (前缀树)||Trie字典树模板

时间:2024-09-14 14:15:16浏览次数:10  
标签:node 字符 Trie 208 children TrieNode 节点 模板

题目:https://leetcode.cn/problems/implement-trie-prefix-tree/description/

以前的板子写得太丑陋了,重新写一份> <

因为是leetcode上的题目,所以是核心代码模式。

字典树(Trie)原理:(因为我语言表达能力不行,所以以下内容来源于小美AI机器人> <)

字典树(Trie)是一种用于高效存储和检索字符串集合的数据结构,特别适用于前缀匹配。它是一种多叉树,其中每个节点代表一个字符。

### 字典树的结构

1. **节点(Node)**:
- 每个节点代表一个字符。
- 根节点通常不包含字符,用于开始操作。
- 每个节点可以有多个子节点,每个子节点代表下一个字符。

2. **边(Edge)**:
- 边连接两个节点,表示从一个字符到下一个字符的转移。

3. **叶节点(Leaf Node)**:
- 叶节点表示一个完整的字符串结束。

### 字典树的基本操作

#### 1. 插入(Insert)

将一个字符串插入到字典树中。

**步骤**:
1. 从根节点开始。
2. 对于要插入的字符串中的每个字符,检查当前节点是否有对应的子节点。
3. 如果有,移动到对应的子节点;如果没有,创建一个新的子节点。
4. 重复步骤2和3,直到处理完字符串中的所有字符。
5. 将最后一个节点标记为单词结束(isEndOfWord = true)。

**示例**:
插入单词 "cat" 和 "car"。
```
(root)
/
c
/ \
a a
/ \
t r
```

#### 2. 查找(Search)

查找一个字符串是否存在于字典树中。

**步骤**:
1. 从根节点开始。
2. 对于要查找的字符串中的每个字符,检查当前节点是否有对应的子节点。
3. 如果有,移动到对应的子节点;如果没有,返回false。
4. 重复步骤2和3,直到处理完字符串中的所有字符。
5. 检查最后一个节点是否标记为单词结束。如果是,返回true;否则,返回false。

**示例**:
查找单词 "cat"。
```
(root)
/
c
/
a
/
t (isEndOfWord = true)
```

#### 3. 前缀查找(Prefix Search)

查找是否存在以指定前缀开头的字符串。

**步骤**:
1. 从根节点开始。
2. 对于要查找的前缀中的每个字符,检查当前节点是否有对应的子节点。
3. 如果有,移动到对应的子节点;如果没有,返回false。
4. 重复步骤2和3,直到处理完前缀中的所有字符。
5. 如果处理完所有字符,返回true。

**示例**:
查找前缀 "ca"。
```
(root)
/
c
/
a (存在前缀 "ca")

代码解释:

1. TrieNode 结构体:
- children:使用 `unordered_map` 存储子节点,键是字符,值是指向子节点的指针。
- isEndOfWord:布尔值,标记当前节点是否为单词的结束。
- 构造函数 TrieNode():初始化 `isEndOfWord` 为 `false`。

2. Trie 类:
- root:根节点,不包含字符。
- insert 方法:插入单词,通过遍历单词的每个字符,如果当前节点没有对应的子节点,则创建一个新的子节点,最后将最后一个节点标记为单词结束。
- search 方法:查找单词,通过遍历单词的每个字符,如果当前节点没有对应的子节点,则返回 `false`。最后检查当前节点是否为单词结束。
- startsWith 方法:前缀查找,通过遍历前缀的每个字符,如果当前节点没有对应的子节点,则返回 `false`。否则返回 `true`。

 1 struct TrieNode{
 2     unordered_map<char,TrieNode*>children;
 3     bool isEndOfWord;
 4     TrieNode():isEndOfWord(0){}
 5 };
 6 class Trie {
 7 private:
 8     TrieNode* root;
 9 public:
10     Trie() {
11         root=new TrieNode();
12     }
13     void insert(const string&word) {
14         TrieNode* node=root;
15         for(auto c:word){
16             if(node->children.find(c)==node->children.end()){
17                 node->children[c]=new TrieNode();
18             }
19             node=node->children[c];
20         }
21         node->isEndOfWord=1;
22     }
23     bool search(const string&word) {
24         TrieNode* node=root;
25         for(char c:word){
26             if(node->children.find(c)==node->children.end())return 0;
27             node=node->children[c];
28         }
29         return node->isEndOfWord;
30     }
31     bool startsWith(const string&prefix) {
32         TrieNode* node=root;
33         for(char c:prefix){
34             if(node->children.find(c)==node->children.end())return 0;
35             node=node->children[c];
36         }
37         return 1;
38     }
39 };
40 
41 /**
42  * Your Trie object will be instantiated and called as such:
43  * Trie* obj = new Trie();
44  * obj->insert(word);
45  * bool param_2 = obj->search(word);
46  * bool param_3 = obj->startsWith(prefix);
47  */

by:AlenaNuna

标签:node,字符,Trie,208,children,TrieNode,节点,模板
From: https://www.cnblogs.com/AlenaNuna/p/18413840

相关文章

  • PbootCMS模板中那些url怎么调用
    在PBootCMS中,httpurl、pageurl 和 sitedomain 标签用于获取当前站点的相关网址信息。以下是详细的使用说明和示例代码。1.当前站点网址标签说明{pboot:httpurl}:自适应获取当前访问网址,主要用于需要使用网站路径前缀的情况。示例输出plaintext https://www.xxx.......
  • PbootCMS模板自动生成当前页面二维码
    在PBootCMS中,qrcode 标签用于生成对应文本的二维码图片。这对于产品列表页或详情页为每个产品生成二维码非常有用。以下是详细的使用说明和示例代码。1. qrcode 标签的基本用法参数说明string=*:指定生成二维码的文本内容。2.示例代码生成产品详情页的二维码假设你需......
  • P4551 最长异或路径(树上前缀异或01-trie)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • P10471 最大异或对 The XOR Largest Pair(01trie)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • 怎么安装使用PbootCMS网站模板
    安装和使用PBootCMS网站模板的过程主要包括以下几个步骤:1.下载模板访问PBootCMS官网或其他可信来源下载你所需的模板文件。确认下载的模板兼容你的PBootCMS版本。2.上传模板将下载好的模板文件上传到你的服务器或虚拟主机。通常模板文件会被压缩,上传之后需要解压到正确......
  • pbootcms模板时间格式调用方法详解
    在PBootCMS中,时间调用主要通过date标签来实现。以下是一些常用的调用方法及其效果示例:列表页时间调用默认格式:[list:date]效果:2021-12-0609:12:30年月日格式:[list:datestyle=Y-m-d]效果:2021-12-06年格式:[list:datestyle=Y]效果:2021月日格式:[list:da......
  • P10470 前缀统计(trie树)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • 基于Uni-app前端框架的SUMER UI3.0组件库!一端开发,多端运行!本组件库可快速二次开发各种
    基于Uni-app前端框架的SUMERUI3.0组件库!一端开发,多端运行!本组件库可快速二次开发各种类别各行业模板,包括:商城、视频、直播、聊天、支付、新闻、社区、地图、导航、出行、社区、博客等sumer-ui介绍基于uView微信小程序UI组件库,兼容vue3。本插件是SUMER组件库,只提供组件......
  • [模板题] - 52. N 皇后 II
    题目链接52.N皇后II思路经典回溯题题解链接【视频】回溯秒杀N皇后!一个视频讲透!(Python/Java/C++/Go/JS)关键点无时间复杂度\(O(n!)\)空间复杂度\(O(n)\)代码实现:classSolution:deftotalNQueens(self,n:int)->int:m=n*2-......
  • java实现根据word模板赋值及电子签章实现
    一:添加相关依赖<!--电子签章实现<!&ndash;免费版.free只支持前三页转化&ndash;>--><dependency><groupId>e-iceblue</groupId><artifactId>spire.office.free</artifactId><......