B站灯笼大神的讲解视频:
av11866460 av16828557
1、把要匹配的字符串拆解成若干个子字符串
2、对于每一个子字符串(除了要匹配的字符串其本身),找出其中最长公共前后缀长度。
3、前缀表第一位补-1,其余位,顺位补最长公共前后缀长度的值。
首先是获取前缀表:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void prefix_table(char *pattern, int *prefix, int n)
{
//首先默认的将前缀表第一个空格写 0
prefix[0] = 0;
//i 和 len 用来作为比较字符时候的移动下标 len从下标0处开始
int len = 0;
//因为前缀表第一个空格已经是0 所以i从下标为1开始
int i = 1;
// n是整个pattern串的长度
while( i < n )
{
//当这两个字符相同时
if( pattern[len] == pattern[i] )
{
//len自增,以待进行下一次比对
len++;
//这时候由于字符相同,最长公共前缀增加了1,也就是len自增的结果
prefix[i] = len;
//i自增,以待下一次比对
i++;
}
//如果不相同的话
else
{
// len>0是为了防止内存越界
if( len > 0 )
{
// 那么len 就等于prefix[len]值,斜着指向
len = prefix[len-1];
}
else
{
//如果len==0或者len<0就让串回到最开始的地方开始比较