字符串匹配
字符串匹配问题就是在一个大的字符串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)时间。(如有谬误欢迎指正)