KMP算法
学习时间2022.12.11
KMP算法
基本概念
- 关于如何理解KMP算法的过程,这篇文章讲解地十分详细The Knuth-Morris-Pratt Algorithm in my own words
- 看完后,我大概理解了怎么求next数组,但是对后面实际执行的过程不太熟悉,没有完全理解
代码实现
暴力匹配算法
typedef char* SString;
//暴力匹配
int Index(SString S, SString T) {
int i = 1, j = 1;
while (i<=S[0]&&j<=T[0])
{
if (S[i] == T[j])
{
i++;
j++;
}
else
{
i = i - j + 2;
j = 1;
}
}
if (j > T[0])
{
return i - T[0];
}
else
{
return 0;
}
}
KMP算法
求next数组
//计算next数组
void Get_next(SString T, int next[]) {
int i = 1;
next[1] = 0;
int j = 0;
while (i < T[0])
{
if (j == 0 || T[i] == T[j])
{
++i;
++j;
next[i] = j;//记录出现重复的位置
}
else
{
j = next[j];
}
}
}
KMP
//KMP算法
int KMP(SString S, SString T, int next[]) {
int i = 1, j = 1;
while (i <= S[0] && j <= T[0])
{
if (j == 0 || S[i] == T[j])
{
++i;
++j;
}
else
{
j = next[j];
}
}
if (j > T[0])
{
return i - T[0];
}
else
{
return 0;
}
}
main函数
int main() {
//主串
char S[256];
//模式串
char T[10];
//next数组
int next[10];
int pos;
S[0] = strlen("abcabaaabacbabc");
strcpy(S + 1, "abcabaaabacbabc");
T[0] = strlen("abacba");
strcpy(T + 1, "abacba");
pos = Index(S, T);
printf("暴力匹配的结果:%d\n", pos);
Get_next(T, next);
for (int i = 1; i <= T[0];i++) {
printf("%3d", next[i]);
}
printf("\n");
pos = KMP(S, T, next);
printf("KMP算法匹配的结果:%d\n", pos);
}