#include <cstdio>
#include <cstdlib>
#include <cstring>
void get_next(const char* str, int next[]);
int run_kmp(const char* src, const char* dest);
int main()
{
char *src = "cadababc";
char *dest = "aac";
int loc = run_kmp(src, dest);
printf("\nloc :%d\n", loc);
system("pause");
return 0;
}
void get_next(const char* str, int next[])
{
int len = strlen(str);
int i = 0, key = -1;
next[0] = -1;
while (i < len-1)
{
if (key == -1 || str[i] == str[key])
{
i++;
key++;
if (str[i] == str[key]) next[i] = next[key]; //
else next[i] = key; //
}
else
key = next[key];
}
}
int run_kmp(const char* src, const char* dest)
{
int len_src = strlen(src);
int len_dest = strlen(dest);
int *next = (int *)malloc(sizeof(int)*len_dest);
get_next(dest, next);
printf("src :%s\ndest:%s\nnext[]: ", src, dest);
for (int s = 0; s < len_dest; s++)
printf("%d ", next[s]);
int i = 0, j = 0;
while (i < len_src && j < len_dest)
{
if (j == -1 || src[i] == dest[j])
{
i++;
j++;
}
else
j = next[j];
}
free(next);
next = NULL;
if (j == len_dest)
return i-j;
return -1;
}
kmp算法实现
最新推荐文章于 2022-12-13 23:34:45 发布