/*
*2018.08.30 12:35
*KMP算法
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//长度不包含空字符
typedef struct {
char *str;
int length;
}String;
void getNext(String *sub, int next[]);
int KMP(String *main, String *sub, int *next);
int main(void) {
String sub = {
"ababaaababaa",
12
};
int next[12];
getNext(&sub, next);
int i = 0;
for (i; i < sub.length; ++i) {
printf("%d ", next[i] + 1);
}
putchar('\n');
system("pause");
return 0;
}
//next的长度与sub的长度一样
void getNext(String *sub, int next[]) {
int i = 0, k = -1;
next[0] = -1;
while (i < sub->length) {
if (k == -1 || sub->str[i] == sub->str[k]) {
++i;
++k;
if (sub->str[i] == sub->str[k])
next[i] = next[k];
else next[i] = k;
}
else k = next[k];
}
}
int KMP(String *main, String *sub, int *next) {
int i = 0, j = -1;
while (i < main->length && j < sub->length) {
if (-1 == j || main->str[i] == sub->str[j]) {
++i;
++j;
}
else j = next[j];
}
if (j == sub->length)
return i - j;
return -1;
}
KMP算法
最新推荐文章于 2021-12-19 11:23:05 发布
本文深入探讨了KMP算法的原理与应用,通过具体的代码示例,详细讲解了如何构造next数组以及如何进行字符串匹配的过程。KMP算法是一种高效的字符串搜索算法,能够避免传统模式匹配算法中的大量重复比较。
9万+





