KMP模式匹配算法

KMP模式匹配算法通过避免不必要的字符比较提高效率。当匹配失败时,模式串根据next数组确定移动位数,next值表示当前子串最长相同前后缀长度。算法包括next数组计算,匹配过程及nextval数组的改进。
摘要由CSDN通过智能技术生成

KMP模式匹配算法

为了解决一般匹配算法的低效问题。避免重复的遍历,我们学习一个KMP算法

算法原理

假设主串S=“abcdefg”,要匹配的字符串T=“abcdex”
我们发现a不与后面的子串中任一字符相等。那么对于一般匹配来说,后面的步骤都是多余的。
算法流程如下:
假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置
1.如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符;
2.如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]。此举意味着失配时,模式串P相对于文本串S向右移动了j - next [j] 位。

换言之,当匹配失败时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值,即移动的实际位数为:j - next[j],且此值大于等于1。

next 数组各值的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀。例如如果next [j] = k,代表j 之前的字符串中有最大长度为k 的相同前缀后缀。

这就意味着在某个字符失配时,该字符对应的next 值会告诉你下一步匹配中,模式串应该跳到哪个位置(跳到next [j] 的位置)。如果next [j] 等于0或-1,则跳到模式串的开头字符,若next [j] = k 且 k > 0,代表下次匹配跳到j 之前的某个字符,而不是跳到开头,且具体跳过了k 个字符。

算法实现

void get_next(string T,int *next)
{
   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值