KMP算法总结和例题(来自kuangbin套题)

本文详细介绍了KMP算法的原理,包括fail数组的含义、求解方法以及如何使用fail数组进行字符串匹配。通过一系列HDU和POJ等在线判题平台的题目,展示了KMP算法在解决字符串匹配问题上的应用。
摘要由CSDN通过智能技术生成

一、KMP算法介绍:

对于两个字符串,如果我们需要在一个串中找到另一个串的出现数量,有两种方法:

在待匹配串中设置指针i,每匹配完一次模式串则往后移一位,该算法的时间复杂度是O(n*m),空间复杂度O(n+m)。

对于这种方法,我们注意到,很多需要匹配的操作实际上是不必要的,比如模式串abcde,待匹配串abcdeabcde,当匹配完b之后移动到匹配c,是完全没有必要的。

因此,为了避免这种情况,KMP算法应运而生。KMP算法对于一个字符串匹配的时间复杂度是O(n+m),空间复杂度是O(n+m)。

以下是KMP算法的实现过程:

KMP算法是通过对模式串预处理,找出失配之后模式串的匹配指针移动的位置,来减少无意义的匹配。这个预处理产生的数组被称为next数组,也称fail数组(理解fail数组的机制就可以对AC自动机的fail指针有更为深刻的理解),以下统一称为fail数组。

fail[i]的意义:

设字符串的字符序号从1开始计数,i是字符串的前i个字符的前缀和后缀的最长相同字符(前后缀均不包括它本身)。

fail数组的求法:

fail数组通过fail[i-1]的信息求解fail[i],利用模式串自己和自己匹配,求得fail数组。fail[0]表示空字符串的前缀和后缀的相同字符长度,显然没有意义,设为-1。设置指针jkj=-1,k=0j为匹配字符位置指针,k为待匹配字符位置指针。然后,如果fail[i-1]=-1,就意味着k的位置为字符串的第一个字符位置,此时得到fail[i]=0;如果fail[i-1]>-1,即表明k的位置大于字符串的第一个字符位置,此时分两种情况:

一、如果两个指针对应的字符相等,则都可以向右移动一位,同时fail[i]=fail[i-1]+1;(若一直都匹配成功,fail[i-1]=j,然后++j

二、如果两个指针对应的字符不相等,则j就要回溯,回溯到哪里呢,这时就要使用fail已经求出的信息了。假设在这之前均匹配成功,由fail数组的定义,字符串中0~fail[i]-1和i-fail[

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值