[算法导论笔记]--字符串匹配与KMP算法

本文介绍了字符串匹配问题的定义,详细讲解了朴素字符串匹配的原理和时间复杂度,然后过渡到有限自动机的概念及其在字符串匹配中的应用。重点解析了KMP算法,包括前缀函数的计算和如何利用前缀函数避免无效匹配,以此实现平均时间复杂度为O(n)的高效字符串匹配。KMP算法的关键在于利用模式的前缀函数,减少了不必要的字符比较,提高了匹配速度。

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

字符串匹配的形式化定义:假设文本是一个长度为n的数组T[1,2…n],而模式是一个长度为m的数组P[1,2…m],其中m<=n,进一步假设P和T的元素都来自一个有限的字母集Σ的字符,例如Σ={0,1}或者Σ={a,b…z},字符数组P和T通常称为字符串。

如下图所示,如果0<=s<=n-m,并且T[s+1…s+m]=P[1…m],那么称模式P在文本T中出现,并且偏移为s。如果P在T中以偏移s出现,那么称s为有效偏移,否则为无效偏移。字符串匹配问题就是找到有效偏移。(图源《算法导论》)

定理1:假设x,y和z是满足y⊐z (表示后缀)的字符串,如果|x|<=|y|,那么.(显然,如果x和y都是z的后缀,而且x长度比y小,那么x肯定也是y的后缀)

一、朴素的字符串匹配

朴素字符串匹配即通过一个循环来找到所有的有效偏移,该循环对n-m+1个可能s值进行检查,看是否满足P[1…m]=T[s+1…s+m].

伪代码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值