字符串匹配算法KMP算法

KMP算法是一种高效的字符串匹配算法,它通过构建next表来处理匹配失败时的回溯问题。next表指示了在匹配失败后子串应跳转的位置,确保避免重复比较。在匹配过程中,如果长串与子串未初始匹配,长串不动,子串调整到0位置,进入匹配循环。关键在于如何构建Next表以实现高效匹配。
摘要由CSDN通过智能技术生成

在这里插入图片描述
一种字符串匹配算法。
在这里插入图片描述
上这个字,没匹配上,于是我们直接把子串拉倒上这里就行了。
在这里插入图片描述
只要没匹配上我们就直接转移到最后一个需要匹配的那个位置,进行重新匹配。

在这里插入图片描述
注意看这个细节,虽然整个句子匹配失败了,但是
我的子句中,有跟子句开头部门一样的地方,而子句中第二次出现跟开头一样的部分这里恰好成功了。所以,我们的子句要调到恰好成功的位置上进行再次进行比较。

在这里插入图片描述
建立一个next表,用来回溯过去。
在这里插入图片描述
next表说白了就是当匹配失败了之后,该往哪里去跳转
子串的指针去跳转到哪里。

一定要明白,什么叫后缀?后缀一定是有后的,有最后一个字的叫后缀
什么叫前缀,有第一个字叫前缀
在这里插入图片描述
当"江"字匹配失败之后
他的前缀字符串是 望江楼上望
望江楼上望 最长相同前后缀 就是江子,长度是1.

在这里插入图片描述

同理这个江匹配失败的话,前面的长串中,最长相等的前后缀是望江
所以长度是2,所以子串回溯到2那个位置去,因为望江两个字都判断成功了。

kmp算法的本质就是,长串一直走,子串跟着走,长串判断失败时候子串就回溯了,回到自己该去的位接着去走。

在这里插入图片描述
这个算法差一点的问题是
长串和短串一开始就没匹配到一起就,那长串不动
短串又调到0这个位置,相当于长短串是万万没变化
而且再进循环时候,还是这个问题,长短串没变化。

在这里插入图片描述
大神算法,倘若当前子串在0的位置,没匹配上的话,会调到一个特殊位置,就是索引变成-1
在这里插入图片描述
要求-1这个状态百分百进匹配循环,进了匹配循环自然是匹配不上的,然后-1+1变成0,子串去了正确的位置又是0这个位置,然后主串还动了,往后走了。

最难得部分是,那个Next表该怎么写

在这里插入图片描述
最核心算法,如何去建立一个Next表。

package org.example.sort;

public class KMP {
   
    public static void 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值