#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int status;
typedef int ElemType;
#define MAXLEN 255
typedef struct
{
char ch[MAXLEN+1];
int length;
}SString;
int Index_BF(SString S,SString T,int pos)
{
int i=pos,j=1;
while(i<=S.length&&j<=T.length)
{
if(S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
{
i=i-j+2;
j=1;
}
}
if(j>T.length)
return i-T.length;
else
return 0;
}
int Index_KMP(SString S,SString T,int pos)
{
int next[T.length];
int nextval[T.length];
get_next(T,next);
get_nextval(T,nextval);
int k=1;
printf("next: ");
for(;k<=T.length;k++)
printf("%d ",next[k]);
printf("\nnextval: ");
for(k=1;k<=T.length;k++)
printf("%d ",nextval[k]);
int i=pos,j=1;
while(i<=S.length&&j<=T.length)
{
if(j==0||S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>T.length)
return i-T.length;
else
return 0;
}
void get_next(SString T,int next[])
{
int i=1,j=0;
next[1]=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
i++;
j++;
next[i]=j;
//next[i-1]=j-1,j保存了前一个的结果
}
else
j=next[j];
}
}
void get_nextval(SString T,int nextval[])
{
int i=1,j=0;
nextval[1]=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
i++;
j++;
if(T.ch[i]!=T.ch[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
int main()
{
/*
SString S,T;
strcpy(S.ch," aaaaaba");
S.length=7;
T.length=2;
strcpy(T.ch," ba");
int i=1;
for(;i<=S.length;i++)
printf("%c",S.ch[i]);
printf("\n%d",Index_BF(S,T,1));
*/
SString S,T;
strcpy(S.ch," acabaabaabcacaabc");
S.length=17;
T.length=8;
strcpy(T.ch," abaabcac");
int i=1;
printf("model: ");
for(;i<=T.length;i++)
printf("%c ",T.ch[i]);
printf("\n");
printf("\nresult:%d",Index_KMP(S,T,1));
return 0;
}
数据结构C语言-串的模式匹配BF算法、KMP算法
最新推荐文章于 2022-11-10 09:57:03 发布