字典树入门
原理
将一个长度为(n)的单词,维护在一个(n)层的树中,每层存对应的字母;判断时,一层一层地判断,最后一层注意要还要判断这个节点是非曾作为为一个单词的终点(如存有abcd,判断abc)
实现
数据结构
struct nod{
int nxt[26];
bool hav;
}t[MAXN];
int tot;
结构体nod
为字典树节点,nod.nxt
表示该节点的儿子们所在的节点,nod.hav
表示该节点是非层作为为一个单词的终点,MAXN
表示这个字典树最大层数,tot
用于分配新节点编号
加入
void add(string s){
int len=s.size(),rot=0;
for(int i=0;i<len;i++){
if(t[rot].nxt[s[i]-'a']!=0) //有无该节点
rot=t[rot].nxt[s[i]-'a']; //有该节点,则跳至该节点,重定向
else{
t[rot].nxt[s[i]-'a']=++tot; //无节点,分配新节点
rot=tot;
}
}
t[rot].hav=1;
}
非递归写法,有点抽象,可以结合上文数据结构理解
查询
bool search(string s){
int len=s.size(),rot=0;
for(int i=0;i<len;i++){
if(t[rot].nxt[s[i]-'a']!=0)
rot=t[rot].nxt[s[i]-'a'];
else
return false;
}
return t[rot].hav;
}
一层一层地找,最后注意判断是非为终点