后缀树练习实例:从目标串S中查找串T重复次数

字符串匹配

字符串匹配问题就是在一个大的字符串T中搜索某个字符串P的所有出现位置。其中,T称为文本,P称为模式,T和P都定义在同一个字母表∑上

题目 :在一篇文章中,找到单词“word”出现的次数

方案:用S+’$'构造后缀树,搜索T节点下的叶节点数目即为重复次数
原理:如果T在S中重复了两次,则S应有两个后缀以T为前缀,重复次数就自然统计出来了。
(来自SunnyYoona的文章:[算法系列之二十四]后缀树(Suffix Tree)

假设有这个文本(Text)有10000个字符(包括标点符号和空格),用这10000个字符和$符号可以创建10001个后缀。单词“word”出现的次数就是“word”作为前缀出现在后缀树中的次数。

python代码:

text = ''  # 总文本
word = ''  # 要在文本中搜索的单词


def occurrences(text,word):
    nb = 0  # 初始化出现次数
    for i in range(len(text)):
        suffix = text[i:] + '$'  # 创建后缀
        for j in range(len(suffix)):
            prefix = suffix[:j]
            if prefix == word:
                nb = nb+1
                break  # 如果发现一次前缀与搜索单词相等的情况就不用继续寻找相等前缀的循环了
    return nb


print(occurrences(text,word))  # 打印出现次数

算法复杂度

n:文本(text)的长度
m:模式(pattern)的长度(m<n)
一共有n+1个后缀,对于某个后缀,模式(Pattern)的查询需要 O(m) 时间,所以一共需要O( n 2 n^2 n2)时间。(如有谬误欢迎指正)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值