力扣 208实现前缀树

本文介绍了如何实现前缀树(Trie),一种利用字符串公共前缀减少查询时间的树形结构。前缀树有3个关键性质:根节点不包含字符,节点包含唯一字符,从根到节点的路径表示对应字符串。文章通过插入、搜索和以某个前缀开始的查询操作来展示其功能,如插入'apple',然后搜索'apple'返回true,搜索'app'返回false,但startWith('app')返回true。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所谓的前缀树:是一种树形结构,利用字符串的公共前缀来减少查询时间;最大限度地减少无所谓字符串的比较;
它有3个性质:根节点不包括字符;除根节点外每一个节点都只包含一个字符,从根节点到某一个节点,路径上经过的字符连接起来为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同;

//实现一个前缀树,包含insert,search,startwith三个函数
分析:主要考察堆前缀树的理解;
例: Trie trie=new Trie();
trie.insert(“apple”);
trie.search(“apple”);//返回true;
trie.search(“app”);//返回false;
trie.startWith(“app”);
trie.insert(“app”);

class Trie{
   
	class TrieNode{
   
	     TrieNode[] next;
	     private boolean isEnd;
	     public TrieNode(){
   
	     nex=new TrieNode[26];
	     isEnd
### C++ 实现前缀(Trie) 前缀(Trie),也称为字典或多叉,是一种用于高效存储和检索字符串数据集的数据结构。它通过共享公共前缀来减少内存消耗并加速查询操作。 以下是基于力扣(LeetCode)题目 `208. Implement Trie (Prefix Tree)` 的解法实现: #### 定义 Trie 节点类 每个节点包含两个部分:指向子节点的指针数组以及标记当前节点是否为单词结尾的布尔变量。 ```cpp class TrieNode { public: bool isEnd; vector<TrieNode*> children; TrieNode() : isEnd(false), children(26, nullptr) {} }; ``` #### 定义 Trie 类及其方法 `Trie` 类封装了插入、搜索和前缀匹配的功能。 ```cpp class Trie { private: TrieNode* root; public: /** Initialize your data structure here. */ Trie() { root = new TrieNode(); } /** Inserts a word into the trie. */ void insert(string word) { TrieNode* node = root; for (char c : word) { int index = c - 'a'; if (!node->children[index]) { node->children[index] = new TrieNode(); } node = node->children[index]; } node->isEnd = true; // Mark end of word } /** Returns if the word is in the trie. */ bool search(string word) { TrieNode* node = startsWithHelper(word); return node && node->isEnd; } /** Returns if there is any word in the trie that starts with the given prefix. */ bool startsWith(string prefix) { return startsWithHelper(prefix) != nullptr; } private: TrieNode* startsWithHelper(const string& s) { TrieNode* node = root; for (char c : s) { int index = c - 'a'; if (!node->children[index]) { return nullptr; } node = node->children[index]; } return node; } }; ``` --- ### 关键点解析 1. **时间复杂度** 插入、搜索和前缀匹配的时间复杂度均为 \(O(m)\),其中 \(m\) 是输入字符串的长度[^5]。 2. **空间复杂度** 空间复杂度取决于字符集大小和插入的字符串数量。对于本例中的小写字母集合,最坏情况下需要的空间为 \(O(NM)\),其中 \(N\) 表示字符串的数量,\(M\) 表示最长字符串的长度。 3. **动态分配与释放内存** 在实际应用中需要注意手动管理内存,避免内存泄漏。可以通过析构函数回收资源。 --- ### 示例代码运行逻辑 假设我们需要执行以下操作序列: - 插入 `"apple"`; - 查询是否存在 `"apple"`; - 查询是否存在 `"app"` 作为完整单词; - 判断是否有任何单词以前缀 `"app"` 开头。 ```cpp int main() { Trie trie; trie.insert("apple"); cout << (trie.search("apple") ? "true" : "false") << endl; // 返回 true cout << (trie.search("app") ? "true" : "false") << endl; // 返回 false cout << (trie.startsWith("app") ? "true" : "false") << endl; // 返回 true trie.insert("app"); cout << (trie.search("app") ? "true" : "false") << endl; // 返回 true } ``` 上述程序会依次打印 `true`, `false`, `true`, `true`。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值