next数组

来源:互联网 发布:天猫数据采集 编辑:程序博客网 时间:2024/06/06 14:13

示例图如下:



详解及代码:

//好久没搞了,全都还回去了,以后还是要面试的//所以又回顾了下,已经不知道是第多少次了//我们知道的是,当匹配串和原串匹配失败后//可以回到匹配串的第一个字符进行匹配//然而next数组是怎么做的呢?//next数组就是当与原串进行匹配失败时//匹配串要回到前面的位置的一个集合void getNext(char s[]){    int len=strlen(&s[1]);    int j=0;    next[1]=0;    //next[1]=0也就是第一个字符与原串匹配失败    //这种情况下,原串的前面和匹配串再无相同子串    //所以原串要向后移动一位,匹配串移到第一位    //next[1]=0是一种约定,也为了下面代码好写    for(int i=1;i<=len;)    {        //1.j<=0也就是上面j=next[1]=0        //说明原串前面和匹配串无相同子串        //故i++向前移动,j++匹配串移到第一位        //与上面说的所有匹配失败,就要回到第一位进行匹配        //2.s[i]==s[j],说明匹配成功了一段子串        //当原串与i+1位匹配失败后,前面的子串都是成功的        //那么自然要移动到j+1位进行匹配        if(j<=0||s[i]==s[j])        {            i++;            j++;            next[i]=j;        }else        {            //匹配失败,根据next数组找到要匹配的位置            //可能会出现连续不匹配的情况,然后使得j=0            j=next[j];        }    }}

优化代码:

//前面提到当不匹配时,j=next[j]可能会进行多次//原因是s[i]==s[j](j=next[i])//与s[i]不匹配,与s[j]也不匹配,优化如下:void getNext(char s[]){    int len=strlen(&s[1]);    int j=0;    next[0]=next[1]=0;    for(int i=1;i<=len;)    {        if(j<=0||s[i]==s[j])        {            i++;            j++;            //当前面子串相同时,s[i+1]匹配不成功            //需要跳到j+1,那么如果s[i+1]==s[j+1]            //跳到j+1就相当于还要跳一次,故不如跳到next[j+1]处            if(s[i]!=s[j])                next[i]=j;            else                next[i]=next[j];        }else        {            j=next[j];        }    }}


0 0
原创粉丝点击