【模版】KMP算法中next数组的求法。

来源:互联网 发布:开源b2c商城系统源码 编辑:程序博客网 时间:2024/05/17 06:56

 前言:今天又重新复习了一下KMP串匹配。寒假集训的时候觉得对这个算法很明了,组成部分就那几个。没想到今天回头再看,在求next那卡住了。突然明白,现在会不是真的会,若干时间后依然记起才是真正的大成。

第一次写,写的有点水,不喜勿喷。委屈

正题:

举例说明

序位            1  2  3  4  5  6  7  8

模式串        a  b  a  a  b  c  a  c

next值         0  1  1  2  2  3  1  2

1.第一位的next值为0 ;

2.第二位的next值为1  后面求解每一位的next值时,根据前一位进行比较;

3.第三位的next值:第二位的模式串为b ,对应的next值为1;将第二位的模式串b与第一位的模式串a进行比较,不相等;则第三位的next值为1;

4.第四位的next值:第三位的模式串为a ,对应的next值为1;将第三位的模式串a与第一位的模式串a进行比较,相同,则第四位的next值得为2;

5.第五位的next值:第四位的模式串为a,对应的next值为2;将第四位的模式串a与第二位的模式串b进行比较,不相等;第二位的b对应的next值为1,则将第四位的模式串a与第一位的模式串a进行比较,相同,则第五位的next的值为2;

 
6.第六位的next值:第五位的模式串为b,对应的next值为2;将第五位的模式串b与第二位的模式中b进行比较,相同,则第六位的next值为3 ;


7.第七位的next值:第六位的模式串为c,对应的next值为3;将第六位的模式串c与第三位的模式串a进行比较,不相等;第三位的a对应的next值为1,则将第六位的模式串c与第一位的模式串a进行比较,不相同,则第七位的next值为1;

 
8.第八位的next值:第七位的模式串为a,对应的next值为1;将第七位的模式串a与第一位的模式串a进行比较,相同,则第八位的next值为2 ;



自附一段求next数组的代码。可当模版来使用。

int  get_next( ){    int i=0,j=-1;     next[0]=-1;      while(i<n)        {            if(j==-1||c[i]==c[j])            {                ++i;                ++j;              next[i]=j;      }      else        j=next[j];      }      }



1 0