前言
在我们学习数据结构字符串的时候会遇到匹配问题,当然我们可以用简单匹配算法,但是为了追求效率我们还有KMP算法 而实现KMP算法是离不开next数组的。
今天我就来讲解一下next数组和进阶next数组nextval;
看此篇文章需要了解一下KMP算法,KMP算法在我另一篇博客里,可以先了解一下再来看;
一、next数组
在讲解之前我们要了解两个概念;
前缀和后缀
看一串字符:a b a b b c
若我们现在正在与主串比较第四个字符
有前缀 :a ,ab ,aba(我们看真前缀-也就是不能等同于前面的字符串)所以aba我们就不看了
有后缀 :a ,ba ,aba (aba不在考虑的范围)
next数组就是取最大相同前后缀字符个数加一;
那么正在匹配的 b 所对应的next[4]=最大相同前后缀字符个数加一=1+1=2;
1、next数组是什么
next数组是为了解决匹配过程中子串回溯的问题,如果每次都像简单匹配算法一样回溯到第一个字符的位置那未免效率太低了,我们看下面一张图:
上面一行是字符数组的下标,为了更能清楚的显示,我是用一开头,前面的第一位可以用来表示字符的个数;
可以看到下面一行就是next数组,数组里面的数的意思是–
当到第三位a不匹配时我们回溯到next数组所指向的哪一位,也就是第一位;
当我们到第五个不匹配时将回溯到第三位,这就是next数组,避免每次都回溯到第一位
2、求next数组
#define MAX 100
typedef struct stu {
char arr[MAX];
int length;
}Str;
void getnext(Str l, int