[INSTANT NOTE] 模式匹配KMP算法

本文介绍了字符串匹配的基本原理,包括暴力匹配算法和KMP算法。详细解释了如何通过这两种方法判断一个字符串是否为另一个字符串的子串,并给出了具体的实现代码及KMP算法中NEXT数组的计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x00使用场景

字符串匹配:给定模板串aaa和目标串bbb,求bbb是否为aaa的子串;如果是,返回开始的indexindexindex

0x01暴力算法

基本思想:如果当前字符匹配成功(S[i]==P[j]S[i] == P[j]S[i]==P[j]),则i++,j++,继续匹配下一个字符;
如果失配(即S[i]!=P[j]S[i]! = P[j]S[i]!=P[j]),i=i−(j−1),j=0i = i - (j - 1),j = 0i=i(j1)j=0。相当于每次匹配失败时,i 回溯到匹配序列开始的字符的下一个,j 被置为0,即子串重新开始匹配。

def match(template:str,sub:str)->int:
	i=0
	j=0
	while(i<len(template) and j<len(sub)):
		if (template[i]==sub[j]):#match
			i+=1
			j+=1
		else:#Dismatch
			i=i-j+1#Backtracking
			j=0
	if j==len(sub):
		return i-j#First index
	else:
		return None#Failed

0x02 KMP

暴力匹配法是出现错配时回溯到sub串的开头,KMP算法的改进点在于回溯到原串预计算的next值。
简单说:如果出现失配现象,则回退next[current_index]next[{current\_index}]next[current_index]个字符,再从目标串的开头尝试配对。

NEXT的求法

考虑子串的最长相等前后缀和。注意是子串才有。
e.g.:
aba的最长相等前后缀长度为1,即{a}。注意前缀是ab,后缀是ba,这两个不相等,后缀也是从左到右的。
abcba仍然是1.
abab是2,因为有ab=ab。

然后将最长相等前后缀向右移一格,sub[0]的部分补-1再全部+1,就是next了。
e.g.
s='aabaac'
p=[0,1,0,1,2,0]#最原始的前后缀和数组
p1=[-1,0,1,0,1,2]#右移一格
next=[0,1,2,1,2,3]#全部+1
注意这里加不加1都可以,看选项的一个数字。

NEXT的使用方法

发生失配时:
主串指针不动,子串index回退到j=j-next[j](注:j从0开始)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值