/*************************串--KMP模式匹配算法*************************/
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define ERROR 0
#define OK 1
#define MAXSIZE 255
typedef int Status;
typedef char String[MAXSIZE+1]; //0号位置用来存储串的长度
/**************************Operator**************************/
Status StrAssign(String T,char *chars) //生成一个其值等于字符串常量chars的串T
{
int i;
if(strlen(chars)>MAXSIZE)
return ERROR;
T[0]=strlen(chars);
for(i=1;i<=T[0];i++)
T[i]=*(chars+i-1);
return OK;
}
int StrLength(String S) //返回串的长度
{
return S[0];
}
Status SubString(String Sub,String S,int pos,int len) //用Sub返回串S的第pos个字符之后长度为len的子串
{
int i;
if(pos<1||pos>S[0]||len<0||len>(S[0]-pos+1))
return ERROR;
for(i=1;i<=len;i++)
Sub[i]=S[pos+1];
Sub[0]=len;
return OK;
}
void PrintString(String S) //输出串
{
int i;
for(i=1;i<=S[0];i++)
printf("%c",S[i]);
printf("\n");
}
void Get_Nextval(String T,int *nextval) //求模式串T的next函数值并存入结果于数组nextval中
{
int i,j;
i=1;
j=0;
nextval[1]=0;
while(i<T[0])
{
if(j==0||T[i]==T[j])
{
i++;
j++;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
int Index_KMP(String S,String T,int pos) //返回子串T在主串S中第pos个字符之后的位置,若不存在,则返回0
{
int i,j,nextval[MAXSIZE];
if(pos<1||pos>S[0]||T[0]>S[0])
return 0;
i=pos;
j=1;
Get_Nextval(T,nextval);
while(i<=S[0]&&j<=T[0])
{
if(j==0||S[i]==T[j])
{
i++;
j++;
}
else
j=nextval[j];
}
if(j>T[0])
return i-T[0];
else
return 0;
}
main(void)
{
int i;
char *str1={"nihaoadnihaoni"};
char *str2={"aoadni"};
String S,T;
StrAssign(S,str1);
printf("%d\n",StrLength(S));
PrintString(S);
StrAssign(T,str2);
printf("%d\n",StrLength(T));
PrintString(T);
i=Index_KMP(S,T,4);
printf("%d\n",i);
i=Index_KMP(S,T,5);
printf("%d\n",i);
}
数据结构之串的KMP模式匹配算法的实现
最新推荐文章于 2021-06-19 15:42:05 发布