关于KMP是一个比较难理解的算法。其作用是求解字符串a中有没有b。如果用常规方法时间复杂度是(Onm),而用KMP时间复杂度为(On+m)。算法是对模拟串进行处理,用数组NEXT记录位置i前的最长前缀和后缀。详见代码如下:
#include<cstdio>
#include<cstring>
int NEXT[1000];
int main()
{
char a[100],b[100];
scanf("%s%s",a,b);
int i,j;
int n = strlen(a);
int m = strlen(b);
j = -1;i=0;NEXT[0] = -1;
while(i<m){
if(j == -1 || b[i] == b[j]){
i++;j++;
NEXT[i] = j;
}
else j = NEXT[j];
}
i = j = 0;
while(i<n){
if(j == -1 || a[i] == b[j]){
i++;j++;
if(j == m) break;
}
else j = NEXT[j];
}
printf("%d\n",i-m+1);
}