KMP实现与失效函数的改进(C++)

KMP算法改进了朴素算法在模式串匹配时的效率问题。通过失效函数(F[]),可以在匹配失败时不从头开始,而是返回当前位置前的真子串长度。在匹配串中有重复子串时,可以通过判断pat[f[4]]是否等于pat[4]来进一步优化,避免无意义的比较。
摘要由CSDN通过智能技术生成

朴素算法的思想最好理解当相同时往后匹配,不同时就再从第一个开始重新匹配,对于无规则乱序还可以,但是如果主串为“abacba”,模式串中如“abab”,我们可以发现当abab后一个匹配失败时朴素算法需要重新从主串的第二个“b”开始与匹配串重新比较,但是KMP就改进了这个缺点,我们已经知道了两个串前三个一样,那为什么不从主串的c与匹配串的第一个b比较,那主串的c就是主串匹配失败的位置,匹配串就是匹配失败时当前位置的前一个的真子串长度,因为匹配失败前都已经匹配成功,而只要知道前面的真子串长度。因为是从0开始记录所以就是真子串的长度而不用加一。
所以我们大概了解了KMP算法:如果当前字符匹配成功就两个都往后移,如果失败,主串位置不变,匹配串返回当前位置前(不含当前字符)真子串的长度。
失效函数也就是求返回当前位置前(不含当前字符)真子串的长度,那么也可以看成是同样使用KMP算法来求。我们令第1个f[0]的为-1

void GetFailure(const String &pat, int f[])
//求匹配串pat的失效函数值
{
    f[0]=-1;                             // 初始f[0]的值为-1
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值