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

 前言:今天又重新复习了一下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];
      }
      }



发布了608 篇原创文章 · 获赞 5904 · 访问量 88万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 酷酷鲨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览