您的位置:首页 > 理论基础 > 数据结构算法

学习笔记------数据结构(C语言版) 串的模式匹配

2016-02-15 12:11 483 查看
//KMP.cpp

#include"predefined.h"
#include"SequenceString.h"

Status Index(SString S,SString T,int pos)
//算法4.5:T为非空串。若主串S中第pos个字符之后存在与T相等的子串,
//则返回第一个这样的子串在S中的位置,否则返回0
{
int i,j;
i=pos;
j=1;
while(i<=S[0]&&j<=T[0])
{
if(S[i]==T[j])
{
++i;++j;
}
else
{
i=i-j+2;
j=1;
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}

int Index_KMP(SString S,SString T,int pos,int next[])
//算法4.6:利用模式串T的next函数求T在主串S中第pos个字符之后的位置的
//KMP算法。其中,T非空,1<=pos<=StrLength(S)
{
int i,j;
i=pos;
j=0;
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}

void get_next(SString T,int next[])
//算法4.7:求模式串的next函数值并存入数组next
{
int i,j;
next[1]=0;
i=1;
j=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}

void get_nextval(SString T,int nextval[])
//算法4.8:求模式串T的next函数修正值并存入数组nextval
{
int i,j;
nextval[1]=0;
i=1;j=0;
while(i<T[0])
{
if(T[i]==T[j]||j==0)
{
i++;
j++;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}

//main.cpp
#include"predefined.h"
#include"SequenceString.h"
void get_next(SString T,int next[]);
int Index_KMP(SString S,SString T,int pos,int next[]);
void get_nextval(SString T,int nextval[]);
int main()
{
int L,i1,i2,pos,i;
SString S,T;
char *s="abaaabcaabaabcacabaabcaabaabcac";
char *t="abaabcac";
StrAssign(S,s);
StrAssign(T,t);
L=StrLength(T);
int next[10];
int nextval[10];
get_next(T,next);
get_nextval(T,nextval);
pos=1;
i1=Index_KMP(S,T,pos,next);
i2=Index_KMP(S,T,pos,nextval);
printf("主 串:");
StrPrint(S);
printf("\n");
printf("模式串:");
StrPrint(T);
printf("\n\n");
printf("next :");
for(i=1;i<=L;i++)
printf("%d ",next[i]);
printf("\n");
printf("从%d个字符起第一次匹配成功的位置为i1=%d\n",pos,i1);
printf("\n");
printf("nextval :");
for(i=1;i<=L;i++)
printf("%d ",nextval[i]);
printf("\n");
printf("从%d个字符起第一次匹配成功的位置为i1=%d\n",pos,i2);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 数据结构