#include <stdlib.h>
#include <stdio.h>
int getNextVal(char *partner, int *next)
{
int i = 0;
int j = -1;
next[i] = j;
int plen = strlen(partner);
while (i < plen)
{
if (j == -1 || partner[i] == partner[j])
{
i++;
j++;
if (partner[i] != partner[j])
{
next[i] = j;
}
else
{
next[i] = next[j];
}
}
else
{
j = next[j];
}
}
return 0;
}
int kmp(char *str, char *partner)
{
int pos = -1;
int i = 0;
int j = 0;
int slen = strlen(str);
int plen = strlen(partner);
int next[100];
getNextVal(partner, next);
while (i < slen && j < plen)
{
if (j == -1 || str[i] == partner[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j == plen)
{
pos = i - j;
}
return pos;
}
int main()
{
char *str = "abcadef";
//char *par = "ababaaababaa";
char *par = "cad";
int pos = kmp(str, par);
return 0;
}
如果碰到匹配串类似"aaaac" next数组([-1,0,1,2,3]) 目标串是"aaaababaa"时 此时i=4 j=4 c和b匹配不成功,j = next[j] ----> j = 3 下一轮循环时 str[i] 依然和 par[j] 不想等 继续next[j] 一直等到j = -1 也不成立 所以有点浪费
getNextVal 做了优化 得到的nextVal数组为[-1,-1,-1,-1,0]