开发者社区> 问答> 正文

kmp算法完整代码(C++)谢谢!

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
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
数据+算法定义新世界 立即下载
袋鼠云基于实时计算的反黄牛算法 立即下载
Alink:基于Apache Flink的算法平台 立即下载