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

原文地址:https://www.cnblogs.com/xinzhiyan/p/7728733.html