KMP next数组的求法

来源:互联网 发布:淘宝网欧式台灯 编辑:程序博客网 时间:2024/05/14 22:03

KMP 算法的next数组求法:

void getNext(char* ptn,int next[]){    int i=0;    int j=-1;    int len=strlen(ptn);    next[0]=-1;    while(i<len){        if(-1==j||ptn[i]==ptn[j]){             i++;j++;             next[i]=j;         }else{              j=next[j];         }    }}

怎么理解呢?

首先我们需要知道这几点:

  1. 如果(-1==j||ptn[i]==ptn[j])这个条件不成立,j会从右边往左按照j_{k+1}=next[j_{k}]更新自己的值。
  2. 如果(-1==j||ptn[i]==ptn[j])这个条件成立,此时可以计算next[i+1]的值为j+1。

我看看这个过程:

当i=6进入while循环之前,j=next[6]。当i=6进入while 循环时执行,

ptn_src: A_0 A_1 A_2 A_3 A_4 A_5 A_6 A_7

ptn_ptn                A_0 A_1 A_2 A_3 A_4 A_5

如果ptn[6]!=ptn[next[6]], 那么下一步比较的是ptn[6]!=ptn[next[next[6]]],如果还不成立继续比较ptn[6]!=ptn[next[next[next[6]]]]直到条件成立或者j=0。

0 0