KMP算法

定义

KMP算法是一种改进的字符串匹配算法,KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。

中心思想

利用已经匹配过的信息,避免再次进行重复匹配

代码实现

int lenA = strlen(A + 1), lenB = strlen(B + 1);
nxt[1] = 0;//对于第一个位置,它只能从头开始匹配

//更新所有B中前缀子串的最大前后缀相等长度nxt数组
 for (int i = 2, j = 0; i <= lenB; i++) {	     //j指代B[i]的下一个查询的位置
	while (j > 0 && B[i] != B[j + 1]) j = nxt[j];//不相等就往回移动
	if (B[i] == B[j + 1]) j++;		             //移动完后,相等就再向后移动一个
	nxt[i] = j;				                     //对于B[i]而言,查询完它之后就可以直接跳到B[j]
 } 

//使用B对于A中前缀子串的最大前后缀相等长度进行对于不可能情况的快速跳跃
for (int i = 1, j = 0; i <= lenA; i++) {
	while (j > 0 && (j == lenB || A[i] != B[j + 1])) j = nxt[j];//这里要注意全部匹配成功也要结束while
	if (A[i] == B[j + 1]) j++;
	f[i] = j;
} 

时间复杂度

假设主串长度为m,子串长度为n,那么主串要比对m-n+1个字符(除了最后那个长度比子串还短的都要比对) 最晦气的情况是刚好每次都是子串的最后一位不同步,那么每个主串字符都要比对n次 最坏情况的时间复杂度将是 O(m-n+1)即 O(mn-n^{2}+n)实际情况是m远大于n(毕竟这个算法发明的意义就是解决m远大于n时暴力算法的不适用),所以可以简写为O(mn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值