您当前的位置: 首页 > 

*DDL_GzmBlog

暂无认证

  • 4浏览

    0关注

    605博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Trie树的归纳(一) 之基础归纳

*DDL_GzmBlog 发布时间:2021-03-26 19:16:20 ,浏览量:4

Trie树的作用

高效存储的查找字符串

在这里插入图片描述

图片来自ACwing(算法学习网) 文中左边是输入的数据 右边是建好的树

void insert(char *str)
{
    int p = 0;
    for (int i = 0; str[i]; i ++ )
    {
        int u = str[i] - 'a';
        if (!son[p][u]) son[p][u] = ++ idx;
        p = son[p][u];
    }
    cnt[p] ++ ;
}

trie树的插入代码

p表示的是层数 for (int i = 0; str[i]; i ++ ) 遍历每一个字符 int u = str[i] - ‘a’; 将字符转换成数字 当作数组下标处理

    if (!son[p][u]) son[p][u] = ++ idx; 		
     ///idx表示的是用到了哪个位置 以免数组重复使用 	
     	如果数组son[p][u] 没有用过 那么就令son[p][u] = ++idx 表示用过了

  	如果当前位置已经存在了字符也就是son[p][u] == true 	
  	那么我们只需要继续往下一层遍历就行 p  = son[p][u]
   	因为这个模板是统计字符出现的次数 	所以cnt[p]++ 打了个记数标记

trie树查询出现次数

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;
        p = son[p][u];
    }
    return cnt[p];
}

如同插入一样 都是直接遍历 如果! son[p][u]表示并没有这个字符串出现过 如果能找到最后一层那么直接返回前面打的标记就行

字符串统计题目传送门 练手的洛谷水题

关注
打赏
1657615554
查看更多评论
立即登录/注册

微信扫码登录

0.0367s