前缀树 是 N叉树 的一种特殊形式。通常来说,一个前缀树是用来 存储字符串 的。前缀树的每一个节点代表一个 字符串(前缀)。每一个节点会有多个子节点,通往不同子节点的路径上有着不同的字符。子节点代表的字符串是由节点本身的 原始字符串 ,以及 通往该子节点路径上所有的字符 组成的。
图中的五角星表示trie树中某个单词的结尾字母,可以用来判断一个单词是否出现过,以及出现了多少次
模板如下:
const int N = 100010;
class Trie {
public:
int son[N][26];
int cnt[N];
int idx;
/** Initialize your data structure here. */
Trie() {
memset(son,0,sizeof(son));
memset(cnt,0,sizeof(cnt));
idx = 0;
}
/** Inserts a word into the trie. */
void insert(string word) {
int p = 0;
for(int i = 0; i < word.size();++i){
int u = word[i] - 'a';
if(!son[p][u]) son[p][u] = ++idx;
p = son[p][u];
}
cnt[p]++; //以某个字母结尾的单词有多少个
}
/** Returns if the word is in the trie. */
bool search(string word) {
int p = 0;
for(int i = 0; i < word.size();++i){
int u = word[i] - 'a';
if(!son[p][u]) return false;
p = son[p][u];
}
if(cnt[p] > 0) return true;
else return false;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
int p = 0;
for(int i = 0; i < prefix.size();++i){
int u = prefix[i] - 'a';
if(!son[p][u]) return false;
p = son[p][u];
}
return true;
}
};