#include <stdio.h>
#include <string.h>
#include <assert.h>
//计算next数组
void get_next(char *pstr, int next[])
{
assert(pstr != NULL);
int len = strlen(pstr);
next[0] = -1;
int pre = -1;
int post = 0;
while (post < len - 1)
{
if (pre == -1 || pstr[post] == pstr[pre])
{
++ pre;
++ post;
next[post] = pre;
}
else
{
pre = next[pre];
}
}
}
//kmp算法
int kmp(char *dstr, char *pstr, int next[])
{
assert(dstr != NULL && pstr != NULL);
int i, j;
int dlen = strlen(dstr);
int plen = strlen(pstr);
i = j = 0;
while (i < dlen && j < plen)
{
if (j == -1 || dstr[i] == pstr[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j == plen)
return i - j;
else
return -1;
}
int main()
{
char dstr[20], pstr[10];
int next[10], tmp;
scanf("%s", pstr);
scanf("%s", dstr);
get_next(pstr, next);
tmp = kmp(dstr, pstr, next);
printf("%d\n", tmp);
return 0;
}
kmp算法的实现
最新推荐文章于 2023-04-09 14:15:00 发布