KMP算法

本文详细介绍了KMP算法,包括其核心原理——利用已匹配字符的前后缀信息避免重复匹配,通过计算next数组优化模式串搜索过程。通过实例演示了get_next函数和KMP匹配函数的使用,并给出了一个测试程序。
摘要由CSDN通过智能技术生成

KMP算法

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

已经匹配过的字符中,相同的前后缀是不需要二次匹配的,因而可以跳过。

计算

计算模式串回溯时需要跳过的字符数,即已匹配的字符相同前后缀的长度

void get_next(char *T, int *next)
{
	int i, j;
	i = 1;
	j = 0;   // j 表示相同前后缀长度
	next[0] = 0;
	while ( i < strlen(T)) {
		if (T[i] == T[j]) { 
			++ j;
			next[i] = j;	// 相同前后缀长度为几就跳过几个字符
			++ i;
		} else {
			if (j == 0) {
				next[i] = 0;
				i ++;
			}
			else 
				j = next[j-1];
		}
	}
}
匹配

主串下标不回溯

int KMP (char *S, char *T, int pos) 
{
	int i = pos;	// 匹配初始位置
	int j = 0;		// 模式串中匹配元素位置
	int lenS = strlen(S);
	int lenT = strlen(T);
	int next[lenT];
	get_next(T, next);
	while (i < lenS && j < lenT) {
		if (j == 0 || S[i] == T[j]) {
			i ++;
			j ++;
		} else {
			j = next[j-1];
		}
	}
	if  ( j > lenT - 1 )
		return i - lenT;
	else
		return 0;
}
测试
int main()
{
	char *A = "abcfagdafafdafdadsaasf";
//	char *B = "abcabx";
//	char *B = "aaaaax";
//	char *B = "gdafaf";
	char *B = "ababaaaba";
	int L[strlen(B)];
	get_next(B, L);
	for (int i=0; i < strlen(B); i ++)
		printf("%d\t", L[i]);
		printf("\n%d", KMP(A, B, 0));
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值