数据结构C语言---模式串next数组和nextval数组的生成

一、next数组(简单易懂)

next函数值仅取决于模式串本身,与主串无关

next数组的生成这里有两种方式:
1.前缀后缀匹配
2.字符串下标匹配
以一个数组为例:
a b a b a a a b a b a a 
我们要生成这个模式串的next数组,那么首先第一件事就是为这些字符标号,
如下;

  序号j: 1 2 3 4 5 6 7 8 9 10 11 12
模式串s: a b a b a a a b a b  a  a

方法一 前缀后缀匹配

  1. 前缀和后缀进行比较,如果前缀和后缀没有相同前缀,则为0+1,如果相同,则相同的字符个数+1;
  2. 前缀取s[n]之前字符的n-2位,后缀取s[n]之前n-1字符后面的后n-2位。
  序号j: 1 2 3 4 5 6 7 8 9 10 11 12
模式串s: a b a b a a a b a b  a  a
 next[]: 0 1
 1.next[1],next[2]无论是什么模式串数组,永远都是0和1。
 
 2.next[3]:如上,序号j[3]对应的模式串s[3],那么我们就看模式串s[3]前面的
 字符即可,即为a b,那么s[3]的前缀为a,后缀为b,a和b不相同,则next[3]为0+1=1;
 
 3.next[4]:序号j[4]对应的s[4],找s[4]的前面字符,为a b a,字符前缀为a、ab;
 后缀为ba, a;有1个相同字符,则next[4]=1+1=2;

 4.next[5]:序号j[5]对应的s[5],找

你可能感兴趣的:(数据结构C语言---模式串next数组和nextval数组的生成)