C++---模式串的next数组和nextval数组

一、求解模式串的next数组

第一位的next的值是0,第二位的next的值为1(固定),后面求解每一位的next的值时。首先将前一位与其next值对应的内容进行比较,如果相等,则该位的next值就是前一位的next值加上1;如果不等,向前继续寻找next值对应的内容与前一位进行比较(向前继续寻找next值对应的内容与next值对应的内容的next前一位进行比较),直到找到某个位上的内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。所以中心思想则是递进查看前一位的next对应的是否和前一位相同。找到相同的则在找到的基础上加1。

例:给出一个模式串S=‘aabaabaab'

1、第一位的next值为0,第二位的next值为1

2、接下来求第三位b,前一位a的next值为1,找到1号下标的值为a。a与a相同则在前一位a的next值上加1;

C++---模式串的next数组和nextval数组_第1张图片

3、接下来看第四位a,前一位b的next值为2,找到2号下标的数为a,a与b不同,则向前继续寻找,即刚才2号下标a的next值为1,1号下标的值为a,a与b不同,同理继续向下寻找,但此时a的next值为0,所以第四位的next值为1;

C++---模式串的next数组和nextval数组_第2张图片

4、接下看第五位a,前一位a的next值为1,找到下标为1的数为a,a与a相同,next值加1;

C++---模式串的next数组和nextval数组_第3张图片

5、接下来看第六位b,前一位a的next值为2,找到2号下标的值为a,a和a相同,next值加1;

C++---模式串的next数组和nextval数组_第4张图片

6、接下来看第七位a,前一位b的next值为3,找到3号下标的值为b,b和b相同,next值加1;

C++---模式串的next数组和nextval数组_第5张图片

7、接下来看第八位a,前一位b的next值为4,找到4号下标的值为b,a和a相同,next值加1;

C++---模式串的next数组和nextval数组_第6张图片

8、接下来看第九b,前一位a的next值为5,找到5号下标的值为a,a和a相同,next值加1;

C++---模式串的next数组和nextval数组_第7张图片

next值:012123456

二、求解模式串的nextval数组

要根据已经求解出的next值,若第一与第二下标的数据相同,则第一位与第二位的nextval值为0、0;不相同,则第一位与第二位的nextval值为0、1;从第三位开始将自身的值与其next值所指向的下标的值比较。若相同则该位的nextval为刚刚比较的值的next值;若不相同则保留自身的next值作为nextval值。

1、第一与第二位下标的数据相同,第一位与第二位的nextval值为0、0

C++---模式串的next数组和nextval数组_第8张图片

2、第三位b的next值为2,下标为2的数为a,b与a不同,第三位的nextval值为2。

C++---模式串的next数组和nextval数组_第9张图片

3、第四位a的next值为1,下标为1的数为a,a与a相同,第四位的nextval值为0。

C++---模式串的next数组和nextval数组_第10张图片

 

4、第五位a的next值为2,下标为2的数为a,a与a相同,第五位的nextval值为1。

C++---模式串的next数组和nextval数组_第11张图片

5、第六位b的next值为3,下标为3的数为b,b与b相同,第l六位的nextval值为2。

C++---模式串的next数组和nextval数组_第12张图片

6、第七位a的next值为4,下标为4的数为a,a与a相同,第七位的nextval值为1。

C++---模式串的next数组和nextval数组_第13张图片

7、第八位a的next值为5,下标为5的数为a,a与a相同,第八位的nextval值为2。

C++---模式串的next数组和nextval数组_第14张图片

8、第九位b的next值为6,下标为6的数为b,b与b相同,第九位的nextval值为3。

C++---模式串的next数组和nextval数组_第15张图片

nextval值:002012123

你可能感兴趣的:(C++---模式串的next数组和nextval数组)