算法 -前缀树

本文介绍了如何利用前缀树数据结构解决查询特定字符开头、结尾及存在的问题,通过实例展示了如何构造树并解答关于'a'、'3'和'235'的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前缀树


假设我们现在有字符"a",“ab”,“ac”,“bc”,“123”,“35”,“73”,问:

  1. 以"a" 开头的字符有多少个?
  2. 是否有以"3"字符结尾的?
  3. 是否存在"235"这样的字符?

针对这种,我们可以根据所有字符,构建出一颗字符的前缀树:
在这里插入图片描述
我们可以以每一个字符,构建出一个节点,每一个节点包含两条信息:through:通过该节点的数量,end:以该节点结尾的数量。

我们先来处理字符"a":
由于我们在当前的tree中还没有“a”这个字符,我们先创建出这一点一个节点:
在这里插入图片描述
由于“a"经过root节点,所以root节点的through变成1,end还是0
"a"节点本身,由于字符”a"是以“a”作为结尾,所以其through变成1,end变成1

下面是处理字符“ab":
”ab“可以被拆分成两个字符:”a”和“b”
针对拆分后的字符“a",由于tree中已经存在节点a,不需要新增节点,但是本次的“a”其实不是以“a”作为结尾的,所以节点a的through变成2,end不变,还是1:
在这里插入图片描述
再处理拆分之后的字符“b”,由于tree中没有这个节点,需要新增“b”这个节点,同时由于“ab"是以”b“结尾的,所以end需要赋值为1:
在这里插入图片描述

以此类推,最终生成的tree结构如下:

在这里插入图片描述

问题一:
以"a" 开头的字符有多少个? 我们从root节点出发 找到包含路径”a“,through=3,即以”a"开头的有3个字符

问题二:
是否有以"3"字符结尾的? 我们从root节点出发找到包含叶子节点路径为"3",可以找到路径“123”,end =1 ,说明有2个字符是以"3"作为结尾的

问题三:
是否存在"235"这样的字符? 我们从root节点出发,我们无法找到从root直接到节点”2“的路径,所以不存在这样的字符
是否存在“a”这样的字符? 我们从root节点出发,可以找到路径“a“,虽然它不是叶子节点,但是end=1,说明有一个字符到此结束,所以存在字符"a"
是否存在”123“这样的字符? 同理从root出发,可以找到这样的路径,是叶子节点,并且end=1,说明存在这样的字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值