笔记文章,感谢B站UP主 正月点灯笼 视频地址1
C语言代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void prefix_table(char pattern[] ,int prefix[] ,int n) {
prefix[0]=0;
int len=0;
int i=1;
while(i<n){
if(pattern[i]==pattern[len]){
len++;
prefix[i]=len;
i++;
}else{
if(len>0){
len=prefix[len-1];//len指针回退,直到两个相等
}else{
prefix[i]=len;//回退到零
i++;
}
}
}
}
void move_prefix_table(int prefix[],int n){
int i;
for(i=n-1;i>0;i--){
prefix[i]=prefix[i-1];
}
prefix[0]=-1;
}
void kmp_search(char text[],char pattern[]){
int n=strlen(pattern);
int m=strlen(text);
int* prefix =(int * )malloc(sizeof(int) * n);
prefix_table(pattern,prefix,n);
move_prefix_table(prefix,n);
int i=0,j=0;
while(i<m){
if(j==n-1&&text[i]==pattern[j]){
printf("success");
j=prefix[j];
}
if(text[i]==pattern[j]){
i++;j++;
}else{
j=prefix[j];
if(j==-1){
i++;j++;
}
}
}
}
int main(){
char pattern[]="ababcabaa";
int prefix[9];
int n=9;
prefix_table(pattern,prefix,n);
move_prefix_table(prefix,n);
for(int i=0;i<n;i++){
printf("%d",prefix[i]);
}
char text[]="abababcabaabababab";
kmp_search(text,pattern);
return 0;
}