#include<stdio.h>
#include<string.h>
typedef struct {
char string[100];
int length;
}String;
int next[100];
void getnext(String p)
{
int i,j;
next[0]=-1;
i=0;
j=-1;
while(i<p.length){
if(j==-1||p.string[i]==p.string[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
int kmp(String t,String p){
int i,j;
i=j=0;
while(i<t.length&&j<p.length){
if(j==-1||t.string[i]==p.string[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j==p.length)
return i-p.length+1;
else return -1;
}
int main(){
String M,P;
int next[50];
printf("请输入模式串:\n");
scanf("%s",M.string);
M.length=strlen(M.string);
printf("请输入匹配串:\n");
scanf("%s",P.string);
P.length=strlen(P.string);
getnext(P);
int n=kmp(M,P);
printf("匹配成功的起始位置在第%d个字符\n",n);
}
next数组尚未优化,本博文将继续补充
模式串匹配(KMP算法)
最新推荐文章于 2020-05-15 02:30:25 发布