#include<stdio.h>
#include<string.h>
#include<malloc.h>
void GetNext(const char str[], int array[])
{ //Next数组中每个元素的值表示前面所有个元素存在的最大的公共子串(与当前字符元素无关)
//并且每个Next数组元素的对应的值还表达前一个元素在最大公共字符串[前区字符串]末尾相等元素的下一个元素的位置
int i = 0, k = -1;
int len = strlen(str) - 1;
array[i] = k;
while (i < len)
{
if (k == -1 || str[i] == str[k])
{
i++, k++;//匹配结束进行下一次匹配
array[i] = k;
}
else
k = array[k];//在该元素前一个元素对应的Next数组值[该值的下标表示前一个元素在前区相等元素的下一个字符]向前回溯[在前区寻找]相等的字符
}
}
int KMP(const char str_f[],const char str_s[])
{
int i = 0, j = 0;
int* array = (int*)malloc(strlen(str_s) * sizeof(int));
if (array == NULL)
return 0;
GetNext(str_s, array);
while (str_f[i] != '\0')
{
if (j == -1 || str_f[i] == str_s[j])
{
i++, j++;
if (str_s[j] == '\0')
{
free(array);
return 1;
}
}
else
j = array[j];
}
free(array);
return 0;
}
int main()
{
const char* str_f = "aaabc";
const char* str_s = "abc";
if (KMP(str_f,str_s))
printf("Finish\n");
else
printf("Error\n");
return 0;
}
KMP算法
于 2024-05-01 22:50:02 首次发布