zoukankan      html  css  js  c++  java
  • kmp算法的个人理解

      这篇博文主要是方便我自己查找使用,网上讲kmp算法的博文已经很多了,大家如果想看其他比较详细的理解过程可以移步别处。

      kmp算法的核心部分在于next表的计算,这里我贴一下我自己常用的板子(kuangbin大神的板子)

    void getNext()
    {
        int j, k;
        j = 0; k = -1; next[0] = -1;
        while(j < tlen)
            if(k == -1 || T[j] == T[k])
                next[++j] = ++k;
            else
                k = next[k];
    
    }

      这版代码next[0]的值取的是-1

      下面说一下常考的next值的快速求法(以next【0】取1为例)

    (1)首先第一第二位分别为0 ,1.

    (2)其他next[n]是前n-1个字符,寻找从前往后和从后往前的最大长度为n-2的最大相同子串,而next值则是该子串长度加1.

    这么说可能不太方便理解,下面我具体写下上述next表的求解过程。

    第3位:取前两位‘ab’,无相同子串,故0+1=1;

    第4位:取前3位‘aba’,能取得‘a’,‘a’,故1+1=2;

    第5位:取前4位‘abaa’,能取得‘a’,‘a’,故1+1=2;

    第6位:取前5位‘abaab’,能取得‘ab’,‘ab’,故2+1=3;

    第7位,取前6位‘abaabc’,无法找到满足要求的子串,故0+1=1;

    第8位,取前7位‘abaabca’,能取得‘a’,‘a’,故1+1=2

  • 相关阅读:
    MFC和Qt优缺点 (MFC几乎没有优点、全面下风)
    获得WIN7管理员权限(可通过修改注册表,或者组策略改变)
    tolua#是Unity静态绑定lua的一个解决方案
    C#实现拼图游戏
    FastDFS分布式文件系统
    生成动态Lambda表达式1
    Azure IoT
    SignalR
    延迟队列功能
    监控知识体系
  • 原文地址:https://www.cnblogs.com/xinzhiyan/p/7728733.html
Copyright © 2011-2022 走看看