代码来自刘汝佳
模板代码:
#include<stdio.h>
#include<string.h>
void getfail(char p[],int f[]) //字符串p自我匹配
{
int len=strlen(p);
f[0]=f[1]=0;
for(int i=1;i<len;i++)
{
int j=f[i];
while(j&&p[i]!=p[j])
j=f[j];
if(p[i]==p[j])
f[i+1]=j+1;//多匹配到了一个字符
else
f[i+1]=0;//该字符配不上
}
}
int find(char* T, char*P, int*f)//p去匹配字符串T
{
int n = strlen(T), m = strlen(P);
getfail(P, f); //得出部分匹配表
int j = 0; //短串的下标
for(int i = 0; i < n; i++) //长串下标
{
while(j && P[j] != T[i])//突然失配了
{
j = f[j]; //j往回退,直到0或者上一个字符相等的位置
}
if(P[j] == T[i])
{
j++; //匹配了一个字符,j++
}
if(j == m) //短串匹配到头了
{
return i - m + 1;//返回成功匹配的起点字符位置
}
}
return -1;
}
int main()
{
char p[100]={"abca"};
char T[100]={"bcdabcdab"};
int f[100];
int t=find(T, p, f);
//自我匹配跳转表
for(int i=0;i<strlen(p);i++)
{
printf("%d ",f[i]);
}
printf("\n t= %d\n",t);//匹配成功的起点位置
return 0;
}