难点:
构造前缀表
利用前缀表比较
如何构建前缀表 KMP算法的过程:
KMP1
KMP2
#include<iostream>
#include<string.h>
#include<malloc.h>
using namespace std;
//pattern:待匹配的子串
//prefix:前缀表
void prefix_table(char *pattern,int *prefix)
{
int len_pattern=strlen(pattern);
prefix[0]=0;//0号位默认value值0
int len=0;//prefix_table存的value值
int i=1;//从第一位开始
while(i<len_pattern){
if(pattern[i]==pattern[len]){
len++;
prefix[i]=len;
i++;
}
else{//不相等
if(len>0){
len=prefix[len-1];//斜着对前一位数的prefix_table
}else{//len==0 value值==0
prefix[i]==len;
i++;
}
}
}
}
//prefix_table数值整体右移一位
void prefix_move(int *prefix,int n)
{
for(int i=n-1;i>0;i--){
prefix[i+1]=prefix[i];
}
prefix[0]=-1;
}
//text[i] len[text] len_text
//pattern[j] len[pattern] len_pattern
void KMP(char *text,char *pattern)
{
int len_text=strlen(text);
int len_pattern=strlen(pattern);
int i=0;
int j=0;
int*prefix=(int*)malloc(sizeof(int)*len_pattern);
prefix_table(pattern,prefix);
prefix_move();
while(i<len_text){
if(j==len_pattern-1&&pattern[j]==text[i]){
cout<<"find at"<<i-j<<endl;
j=prefix[j];
}
if(pattern[j]==text[i]){
i++;
j++;
}
else{
j=prefix[j];
if(j=-1){
i++;
j++;
}
}
}
}
int main()
{
char text[100];
char pattern[100];
KMP(text,pattern);
return 0;
}