美文网首页
KMP算法的简单实现

KMP算法的简单实现

作者: 初七123 | 来源:发表于2018-09-10 11:25 被阅读11次

KMP的工作原理

阮一峰的博客讲的非常好
点击访问!!

KMP的代码实现

动态规划求解NEXT

这里设NEXT数组等价最长公共前后缀数组(非经过平移加一的NEXT数组)
设当前要求解NEXT[q],同时已经求出了 NEXT[i](i < q)

  1. 如果P[q] == P[k](k == NEXT[q-1]),直接k++使最长匹配前后缀增长一位
  2. 如果P[q] != P[k],则取k = NEXT[K - 1],这是因为当前最长匹配无法继续增长,找次最长匹配继续尝试(画个图就明白了)。
void makeNext(const char P[],int next[])
{
    int q, k;
    int m = strlen(P);
    next[0] = 0;
    for (q = 1, k = 0; q < m; ++q)
    {
        while(k > 0 && P[q] != P[k])
            k = next[k - 1];
        if (P[q] == P[k])
        {
            k++;
        }
        next[q] = k;
    }
}

手动计算NEXT的过程

KMP匹配
当前项相等继续匹配下一个字母
不相等取NEXT数组相应的值移动带匹配数组

int kmp(const char T[],const char P[],int next[])
{
    int n, m;
    int i, q;
    n = strlen(T);
    m = strlen(P);
    makeNext(P,next);

    for (i = 0, q = 0; i < n; ++i)
    {
        while(q > 0 && P[q] != T[i])
            q = next[q - 1];
        if (P[q] == T[i])
        {
            q++;
        }
        if (q == m)
        {
            printf("Pattern occurs with shift:%d\n",(i-m+1));
        }
    }    
}

相关文章

  • 算法(2)KMP算法

    1.0 问题描述 实现KMP算法查找字符串。 2.0 问题分析 “KMP算法”是对字符串查找“简单算法”的优化。 ...

  • KMP算法的简单实现

    KMP的工作原理 阮一峰的博客讲的非常好点击访问!! KMP的代码实现 动态规划求解NEXT 这里设NEXT数组等...

  • 字符串匹配与KMP算法

    1.朴素字符串匹配算法 2.KMP算法 求前缀函数 实现KMP算法 3.测试代码

  • KMP算法 理解与实现

    KMP算法,背景不必多说,主要想写一写自己对KMP算法的一些理解和其具体实现。关于KMP算法的原理,阮一峰老师的这...

  • KMP算法

    参考文献1.B站灯笼哥2.KMP算法python实现3.如何更好的理解和掌握 KMP 算法?

  • KMP 专题整理

    KMP 学习记录 kuangbin专题十六——KMP KMP 学习总结 朴素 KMP 算法 拓展 KMP 算法(E...

  • (303)查找-基于DFA的KMP字符串匹配

    概述 基于DFA的KMP算法。是根据DFA状态转换表来实现。下面是java实现的代码 理论 关于kmp理论部分 《...

  • KMP算法理解

    KMP的由来 在KMP算法之前,对文本进行匹配时使用的是朴素模式匹配算法,也就是最简单匹配算法.当然运行效率也是让...

  • 对KMP算法的一些理解

    最近学到KMP算法,下面讲讲对KMP算法的一些个人理解,希望对大家有帮助! 对于KMP算法的理解: 整个KMP算法...

  • 白话 KMP 算法

    KMP 算法是计算机字符串匹配的常规算法。wiki 本篇文章借助简单示例,用通俗易懂的方式描述对 KMP 算法的...

网友评论

      本文标题:KMP算法的简单实现

      本文链接:https://www.haomeiwen.com/subject/bpnjgftx.html