#include<iostream>
using namespace std;
int KMPmatching(char *s,char *t,int *next);
void getnext(char *t,int *next);
int main()
{
char a[100],b[100];
int next[100];
int i=0;
cout<<"请输入数组的元素:";
char ch=getchar();
while(ch!='\n')
{
a[i]=ch;
i++;
ch=getchar();
}
a[i]=0;
i=0;
cout<<"请输入子串的元素:";
ch=getchar();
while(ch!='\n')
{
b[i]=ch;
i++;
ch=getchar();
}
b[i]=0;
getnext(b,next);
if(KMPmatching(a,b,next))
cout<<"子串的首字母位置为:"<<KMPmatching(a,b,next)<<endl;
else
cout<<"子串不存在!"<<endl;
return 0;
}
void getnext(char *t,int *next)
{
int j=0,k=-1,m=strlen(t);
next[0]=-1;
while(j<m-1)
{
if(k==-1||t[j]==t[k])
{
j++;
k++;
next[j]=k;
}
else
k=next[k];
}
}
int KMPmatching(char *s,char *t,int *next)
{
int i=0,j=0,n=strlen(s),m=strlen(t);
while(i<n&&j<m)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>=m)
return i-m;
else
return -1;
}
KMP算法
最新推荐文章于 2024-05-30 20:15:33 发布