#include"iostream"
#include"cstdio"
using namespace std;
#define maxlen 100
int fail[maxlen];
void makefail(char *t,int lt)
{
--t;
for(int i=1,j=0;i<=lt;i++,j++){
fail[i]=j;
while(j>0&&t[i]!=t[j]) j=fail[j];
}
}
int kmp(char *s,int ls, char *t,int lt,int i,int &longest,int &lp)
{
longest=lp=0;
--s;--t;
for(int j=1;i<=ls;i++,j++){
while(j>0&&s[i]!=t[j]) j=fail[j];
if(j>longest) {
longest=j;lp=i-j;
}
if(j==lt) return i-lt;
}
return -1;
}
int main()
{
char s[100]="fbaataa";
char t[100]="baaa";
int longest,lp,pos;
pos=kmp(s,strlen(s),t,strlen(t),0,longest,lp);
cout<<longest<<" "<<lp<<" "<<pos<<endl;//longest:最长匹配的长度 lp:最长匹配的起始位置 pos:第一个匹配到的位置
return 0;
}
KMP
最新推荐文章于 2023-01-23 18:57:44 发布