kmp算法

一个长度为n的字符串T(文本串),和长度为m的字符串(模板串),在字符串T中寻找字符串匹配点,朴素的算法就是二重循环暴力寻找,这样的时间复杂度为O(n*m),而现在要介绍的kmp算法时间复杂度O(n+m),这个时间复杂度已经达到理论的上届了,因为至少所有的字符都需要遍历

1.算法的本质

kmp算法是利用模板串自身的特性判断出失配后该走向哪里

比如字符串abbaaba在匹配到最后一个的时候发现不匹配了,这个时候前面6个文本字符的信息abbaab的信息就可以加以利用前缀ab和后缀ab相同,所以移动至少要移动4位,而为了记录每次失配后应该怎么走需要在引进一个数组f

void getfail(char *p,int *f)
{
	int m=strlen(p);
	f[0]=0;
	f[1]=0;
	for(int i=1;i

顺着失配边走已经保证前面一定是匹配的,只要当前能够匹配,模板串向右移

你可能感兴趣的:(杂类)