这篇博文主要是方便我自己查找使用,网上讲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