字典树(Trie)

基本概念

高效存储查找字符串集合的数据结构。

依次插入 "cat" ,"car", "busy".

通常在实现的时候,会在节点结构中设置一个标志,用来标记该结点处是否构成一个单词(关键字)

代码实现模板

const int N = 1e6+10;
				
				//0 既是根节点 又是空节点 
int son[N][26]; // 如son[p][j] 存储从节点 p 沿着j这条边 走到的子节点 。 边为26个小写字母(a~z) 对应的映射值 0~25 
int cnt[N]; // 如cnt[p] 存储以节点p结尾的单词的插入次数 
int idx;

//插入一个字符串 
void insert(char* str){ 
    int p = 0; //从根节点开始 
    for(int i = 0 ; str[i]; i++){ //遍历该字符串中的每个字符  str[i]字符串以 \0 结尾 
        int u = str[i] - 'a'; //将26个字母 映射成0~25 
        if(!son[p][u]) son[p][u] = ++idx; //若字典树中没有 该字母 将该字母插入 
        p = son[p][u]; //令下一个字母 从上一个字母结束位置开始 
    }
    cnt[p]++; //以p结尾的单词 加1 
}

//查询字符串出现次数 
int query(char*str){
    int p = 0;
    for(int i = 0; str[i]; i++){
        int u = str[i] - 'a';
        if(!son[p][u]) return 0; //若没找到 返回0 
        p = son[p][u];
    }
    return cnt[p]; //找到返回出现次数 
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值