实现 Trie (前缀树
Posted ych9527
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现 Trie (前缀树相关的知识,希望对你有一定的参考价值。
实现 Trie (前缀树)
方法1
-
利用哈希进行实现
-
插入单词时,将单词添加至set之中,达到去重的目的
-
查找单词是否存在时,直接从set中进行查找即可
-
查找部分单词时,遍历整个set,进行比较查找
void insert(string word) {//向前缀树中插入字符串 st.insert(word); } /** Returns if the word is in the trie. */ bool search(string word) {//查找单词word是否在前缀树之中 if(st.find(word)!=st.end()) return true; return false; } /** Returns if there is any word in the trie that starts with the given prefix. */ bool startsWith(string prefix) {//查找是否有前缀为prefix的单词 for(auto&e:st) { int begin1=0; int begin2=0; while(begin1<e.size()&&begin2<prefix.size()) { if(e[begin1]==prefix[begin2]) { begin2++;//当前字符匹配,则挪到下一个位置 begin1++; } else//当前是不匹配的 break; } if(begin2>=prefix.size())//找到了前缀和 return true; } return false; } unordered_set<string> st; };
方法2
- 创建一颗多叉树
- 当前类中,两个成员变量,一个标记当前是否是单词的末尾,另外一个存储下一个可能的字符
- 在插入的时候,创建多个节点,依次挂接起来
- 进行查找的时候,再去遍历这颗树,进行比较判断
Trie() {
IsEnd=false;
for(int i=0;i<26;i++)
{
next[i]=nullptr;
}
}
void insert(string word) {
Trie* node=this;
for(auto&e:word)
{
if(node->next[e-'a']==nullptr)//当前没有该字符
node->next[e-'a']=new Trie;
node=node->next[e-'a'];
}
node->IsEnd=true;//标记结尾
}
bool search(string word) {//查找这个单词
Trie *node=this;
for(auto&e:word)
{
if(node->next[e-'a']==nullptr)
return false;//当前没有
node=node->next[e-'a'];
}
if(node->IsEnd==true)//是结尾
return true;
return false;
}
bool startsWith(string prefix) {//查找部分
Trie *node=this;
for(auto&e:prefix)
{
if(node->next[e-'a']==nullptr)
return false;//当前没有
node=node->next[e-'a'];
}
return true;
}
bool IsEnd;
Trie* next[26];
};
以上是关于实现 Trie (前缀树的主要内容,如果未能解决你的问题,请参考以下文章