字典树(trie)

Posted kyledeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典树(trie)相关的知识,希望对你有一定的参考价值。

这个模板是查询字串出现次数的

举个例

a

ab

abc

abcd

则a出现了4次,b出现了3次,c出现了2次,d出现了一次。

字典树的操作都大同小异,所以要牢记此模板。

#include<bits/stdc++.h>
using namespace std;

const int maxn=10001;

struct Trie//初始化,加点,加字串,查询字串 
{
    int ch[maxn][26];//记录每个结点的子节点编号(编号从0开始) 
    int cnt[maxn];//记录字串出现次数
    int num;//顺序结点编号直到最后一个结点 
    
    void clean()//初始化 
    {
        memset(ch,0,sizeof(ch));
        memset(cnt,0,sizeof(cnt));
        cnt[0]=0;
        num=0;
    }//一起初始化防止被hack 
    
    int newnode()//添加新节点 
    {
        num++;//编号加
        return num;//返回编号 
    }
    
    void insert(string s)//读入字符串后从头开始向下比较,没有就添加 
    {
        int u=0;
        int n=s.size();
        for(int i=0;i<n;i++)
        {
            if(ch[u][s[i]-a]==0)
            {
                ch[u][s[i]-a]=newnode();
            }
            u=ch[u][s[i]-a];//更新到下一个结点
            cnt[u]++;//下个结点++(从0结点开始) 
        }
    }
    
    int query(string s)//读入字符串后从头开始向下查询,没有就返回0 
    {
        int u=0;
        int n=s.size();
        for(int i=0;i<n;i++)
        {
            if(ch[u][s[i]-a]==0) return 0;//没找到 
            u=ch[u][s[i]-a];
        }
        return cnt[u];//返回出现次数 
     } 
}trie;

int main()
{
    trie.clean();//记得初始化!!! 
    trie.insert("a");
    trie.insert("ab");
    trie.insert("abc");            
    trie.insert("abcd");
    cout<<trie.query("a")<<endl<<trie.query("ab")<<endl<<trie.query("abc")<<endl<<trie.query("abcd");
    cout<<endl;
    return 0;
}

 

以上是关于字典树(trie)的主要内容,如果未能解决你的问题,请参考以下文章

trie树(字典树)

前缀树(字典树/Trie) -----Java实现

01字典树

数据结构——trie树(字典树)

LeetCode 208. 实现 Trie (前缀树)

Trie树(字典树)