kmp算法完整代码(C++)谢谢!
收起
知与谁同
2018-07-18 09:20:32
1612
0
3
条回答
写回答
取消
提交回答
-
刚学应该仔细看书,首先要学会自己用手一步一步模拟计算的过程,把中间步骤记录下来,作为测试用例。复杂算法居然直接看代码,你认为自己很牛吗。
2019-07-17 22:55:52
-
#include"stdio.h"
#include "conio.h"
#include "stdio.h"
#include "math.h"
int result;
char pat[]="kaka";
char str[]="iamkaka";
int next[7];
void getNext(char pat[], int next[])
{
int j = 0;
int k = -1;
next[0] = -1;
while (pat[j])
{
if ( k == -1 || pat[j] == pat[k])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
int KMP(char *str1, char*pat, int *next)
{
int i=0,j=0;
while(str[i])
{
if(pat[j]==0)
return i-j;
if(j==0 || str[i]==pat[j])
{
++i;
++j;
}else
j=next[j];
}
if(pat[j]==0)
return i-j;
return -1;
}
int main(int argc, char* argv[])
{
int i;
getNext(pat,next);
result=KMP(str,pat,next);
printf("%s\n",str);
for(i=0;i<result;i++) printf(" ");
printf("%s\n",pat);
printf("at %d\n",result);
getch();
return 0;
}
这个算法有点难理解的
Dev-C++ 编译测试通过:
结果:
iamkaka
kaka
at 3
祝你好运。
这种题目考试有必杀技的。我用颜色标注了的,但是这里不能用颜色来讲解NExt数组的变化。
有需要。给我留言。
2019-07-17 22:55:52
-
我建议你先弄懂kmp的匹配过程,先看看严蔚敏的视频教程,有讲到,看完之后你就会了解,在自己琢磨
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std; //伪代码中的fail数组,用fail来表示
int fail[1000];
//预处理fail数组
void ComputePrefixFunction(char *P)
{ int m = strlen(P);
memset(fail, 0, sizeof(fail));
fail[0] = 0;
int k = 0;
for (int i = 2; i <= m; i++)
{ while (k > 0 && P[k] != P[i - 1])
{ k = fail[k - 1]; }
if (P[k] == P[i - 1])
{ k = k + 1; }
fail[i - 1] = k;
}
}
void KMPMatcher(char *T, char *P)
{ int n = strlen(T);
int m = strlen(P);
int q = 0;
for (int i = 1; i <= n; i++)
{
while (q > 0 && P[q] != T[i - 1])
{ q = fail[q - 1]; }
if(P[q] == T[i - 1])
{ q = q + 1; }
if(q == m)
{ printf("匹配位置: %d\n", i - m + 1);
q = fail[q - 1];
}
}
}
int main()
{
KMPMatcher("123451233211234561234", "12345");
return 0;}
2019-07-17 22:55:52