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

字符串匹配的形式化定义:假设文本是一个长度为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].

伪代码如下:

在最坏情况下,朴素匹配方式的时间复杂度是O((n-m+1)*m)

朴素匹配尽管代码十分简洁通俗,但一般情况下效率并不高。

 

二、利用有限自动机进行字符串匹配

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值