数据结构之串的KMP模式匹配算法的实现

来源:互联网 发布:淘宝嘉年华免邮 编辑:程序博客网 时间:2024/05/16 15:18
/*************************串--KMP模式匹配算法*************************/#include"stdio.h"#include"string.h"#include"stdlib.h"#define ERROR 0#define OK 1#define MAXSIZE 255typedef int Status;typedef char String[MAXSIZE+1];//0号位置用来存储串的长度/**************************Operator**************************/StatusStrAssign(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;elsenextval[i]=nextval[j];}elsej=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];elsereturn 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);}

0 0
原创粉丝点击