【数据结构】Trie

目录

一:简介

二:代码

三:应用

四:总结


一:简介

Trie,又称字典树,常用来存储和查询字符串。假定接下来提到的字符串均由小写字母构成,那么Trie将是一棵 26  叉树。

  1. 根节点为空;
  2. 字符从最左存入,如abcd一条线,若存入abe,那么就在b点向右延申一条线含点e;
  3. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;

 

注意是有终点的,如插入abc,查找ab就=0 ,因为abc终点是c,没查入过ab

二:代码

维护一个字符串集合,支持两种操作:

“I x”向集合中插入一个字符串x;
“Q x”询问一个字符串在集合中出现了多少次。
共有N个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。

输入格式
第一行包含整数N,表示操作数。

接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。

输出格式
对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。

每个结果占一行。

数据范围
1≤N≤2∗104
输入样例:
5
I    abc

Q   abc
Q   ab        //没输入过ab,所以查询为0
I     ab
Q   ab

输出样例:
1
0
1

 

#include<iostream>
using namespace std;
const int N=100010;
int son[N][26],cnt[N],idx;//son[N][26]用来存储Trie树中的子节点,cnt[N]存储的是以当前点结尾的单词有多少个,idx存储当前用到的那个下标。 *这里需要注意下标是0的点,既是根节点,又是空节点。

char str[N];

void insert(char str[])//存储字符串
{
    int p=0;//根节点
    for(int i=0;str[i];i++)//判断是不是走到最后
    {
        int u=str[i]-'a';//当前字母子节点的编号,即将a——z映射到0——25
        if(!son[p][u])  son[p][u]=++idx;//如果当前子节点不存在就创造一个点来存储子节点
        p=son[p][u];//让p走到子节点的位置
    }

    cnt[p]++;//结尾是p的字符串个数加加
}


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];//否则让p走到子节点的位置
    }
    return cnt[p];//最后返回以p结尾的字符串个数
}
//具体题目实现

int main(){
int n;
scanf("%d",&n);
while(n--){
char op[2];
scanf("%s%s",op,str);
if(op[0]=='I')insert(str);
else printf("%d",query(str));
}

return 0;
}

三:应用

四:总结

 Trie树其实是一种用空间换时间的算法,它占用的空间一般很大,但时间是非常高效的,插入和查询的时间复杂度都是O(l)的,总体来说还是很优秀的。不用担心字节个数过大的情况,一般题上会给出已知条件来控制子节点个数,例如字符串只包括小写字母大写字母等等。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漆黑の莫莫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值