字典树

字典树入门

原理

将一个长度为\(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;
}

一层一层地找,最后注意判断是非为终点

posted @ 2018-11-09 22:01  Santiego  阅读(174)  评论(0编辑  收藏  举报