假设s1是待进行匹配的字符串,s2是具体匹配串。eg:s1 = "fegeahellodfskaf",s2 = "hello"。
相较于BF(Brute Force)算法,KMP算法利用了已匹配字串信息。它的实现方式分为两步,第一步,构造next数组;第二步,根据next数组决定后移位数,进行匹配。
1.构造next数组。
next数组是存储s2字串的最长前后缀长度信息的数组。eg:对于字符串“abcabd”,next[]存储的内容分别是[-1,0,0,0,1,2]。next[5]表示s2前面5个字符的最长前后缀长度,前缀为“ab”,后缀为"ab"。
next数组C语言实现方式:
void getnext(char *s2, int * next, int len){ // 传入参数分别是 s2 字符串 ,next 数组,s2字符串长度
int k = 0; // k表示前一次比较最长前后缀长度
next[0] = -1;
next[1] = 0;
for (int i = 2; i<len; i++){
if(k==0){ // 说明前一次最长前后缀长度为0,所以只需要比较第一个和最后一个字符
if(s2[k]==s2[i-1]) k = 1;
} else {
if(s2[k]==s2[i-1]) k=k+1; // 继续比较是否能有更长的最长前后缀
else{
//没有更长的前后缀,前后缀大小会变小,