KMP算法模式匹配算法

KMP算法是模式匹配算法的一种改进算法,是D.E.Knuth与V.R.Pratt和J.H.Morris同时发现的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。这个算法主要依靠get_next函数计算出子串中每个字符对应的next[j]的值,从而减少子串回溯的距离,减少时间复杂度。
具体算法如下:
#include<iostream.h>
#include<string.h>
int Index_KMP(char* S,char* T,int pos,int next[])
{
//利用模式串T的next函数求T在主串S中第pos各字符之后的位置的KMP算法。
//其中,T非空,1<=pos<=strlen(S)。
int i=pos;
int j=1;
while(i<=strlen(S)&&j<=strlen(T))
{
if(j==0||S[i-1]==T[j-1])//继续比较后续字符
{
i++;
j++;
}
else//模式串向右移动
{
j=next[j];
}
}
if(j>strlen(T))//匹配成功
return i-strlen(T);
else
return 0;
}
void get_next(char* T,int next[])
{
//求模式串T的next函数值并存入数组next[]中。
int i=1;
int j=0;
next[1]=0;//注意在此,next[]数组的第一个数a[0]没有存储对应的值,
//是为了与模式匹配过程中的下标对应。
while(i<strlen(T))
{
if(j==0||T[i-1]==T[j-1])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
void main()//主函数,用来测试算法的正确性
{
char* a="adbidsfkjdi";
char* b="ids";
int next[10];
get_next(b,next);
cout><<Index_KMP(a,b,0,next)<<endl;
}>

你可能感兴趣的:(算法,J#)