【LeetCode】实现 Trie(前缀树)
创作时间:
作者:
@小白创作中心
【LeetCode】实现 Trie(前缀树)
引用
CSDN
1.
https://m.blog.csdn.net/qq_41840843/article/details/144995861
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 * 10^4 次
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#define ALPHABET_SIZE 26
typedef struct TrieNode {
struct TrieNode* children[ALPHABET_SIZE];
bool isEndOfWord;
} TrieNode;
typedef struct {
TrieNode* root;
} Trie;
// 创建新的 Trie 节点
TrieNode* createNode() {
TrieNode* node = (TrieNode*)malloc(sizeof(TrieNode));
node->isEndOfWord = false;
for (int i = 0; i < ALPHABET_SIZE; i++) {
node->children[i] = NULL;
}
return node;
}
// 初始化 Trie 树
Trie* trieCreate() {
Trie* trie = (Trie*)malloc(sizeof(Trie));
trie->root = createNode();
return trie;
}
// 向前缀树中插入字符串
void trieInsert(Trie* obj, char* word) {
TrieNode* curr = obj->root;
for (int i = 0; word[i]!= '\0'; i++) {
int index = word[i] - 'a';
if (curr->children[index] == NULL) {
curr->children[index] = createNode();
}
curr = curr->children[index];
}
curr->isEndOfWord = true;
}
// 搜索字符串是否存在
bool trieSearch(Trie* obj, char* word) {
TrieNode* curr = obj->root;
for (int i = 0; word[i]!= '\0'; i++) {
int index = word[i] - 'a';
if (curr->children[index] == NULL) {
return false;
}
curr = curr->children[index];
}
return curr->isEndOfWord;
}
// 搜索前缀是否存在
bool trieStartsWith(Trie* obj, char* prefix) {
TrieNode* curr = obj->root;
for (int i = 0; prefix[i]!= '\0'; i++) {
int index = prefix[i] - 'a';
if (curr->children[index] == NULL) {
return false;
}
curr = curr->children[index];
}
return true;
}
// 释放 Trie 树内存
void trieFree(Trie* obj) {
// 辅助函数,用于递归释放节点内存
void freeNodes(TrieNode* node) {
if (node == NULL) {
return;
}
for (int i = 0; i < ALPHABET_SIZE; i++) {
freeNodes(node->children[i]);
}
free(node);
}
freeNodes(obj->root);
free(obj);
}
热门推荐
立普妥降脂效果获验证,国产仿制药安全性更优
遂宁圣莲岛:世界荷花博览园里的生态明珠
遂宁两大景点:千年古刹与盐度超死海
遂宁市博物馆:国内唯一专题类宋瓷博物馆,藏1005件南宋珍品
四川遂宁“死海”:高盐度湖水可轻松漂浮,成都游客1小时可达
医生转行政岗:工作压力小了,但成就感可能也少了
从60亿骗贷案看企业合规管理:西门子经验与齐鲁教训
《看门狗:军团》到底值不值得玩?
《大香蕉》校园走红引发争议:如何正确引导孩子远离不良内容?
按摩垫怎么清洗?每次用完都需要彻底清洗吗?
脚垫子怎么治疗
春节思乡诗句,让你秒懂乡愁
高适《除夜作》:一首跨越千年的思乡曲
叔虞方鼎:这里是晋国!
君子兰春季播种全攻略:从果实采摘到幼苗管理
秋季君子兰高效播种技巧全攻略
垂笑君子兰果实成熟记:耐心等待9个月!
AI重塑华尔街:20万岗位调整,银行开启智能化转型
新鱼过温过水的时间?
金鱼长寿指南:从环境到饲养的全方位养护要点
典韦25级技能进阶攻略:秒杀脆皮不是梦!
如何做好B端产品的竞品分析?我总结了3个章节
冬游大连citywalk必打卡的9件幸福感小事!
知青养老保险制度解读:参保条件与待遇保障
社保未满15年不能一次性补缴,可申请转移或延缴
舰载机飞行员VS民航飞行员:谁才是蓝天霸主?
飞行员学历门槛揭秘:本科学历成标配?
诗经产品命名:文化传承与创新在产品名称中的应用
《看门狗:军团》策略要素深度解析
健康饮食助你摆脱坏情绪