/**************************KMP算法**************************/
#include <stdio.h>
/*获取T串的next数组*/
void get_next(char *T,int *next)
{
int i=0,j=-1;
next[0]=-1;
while(i<strlen(T))
{
if(-1==j||T[i]==T[j]) //若j==-1或匹配成功,则继续匹配,并且将next[i]=j
{
i++;j++;
next[i]=j;
}
else
j=next[j]; //若失配,则j向前回溯到已匹配好的位置
}
}
/*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回0*/
/*T非空,1<=pos<=strlen (S)*/
int Index_KMP(char *S,char *T,int pos)
{
int k;
int i=pos; /*i用于主串S当前位置下标值,若pos不为0,则从pos位置开始匹配*/
int j=0; /*j用于子串T中当前位置的下标*/
int next[255]; /*定义一个next数组*/
int S_len=strlen(S),T_len=strlen(T);
get_next(T,next); /*得到T串的next数组*/
while(i<S_len&&j<T_len) /*若i小于S的长度且j小于T的长度,循环继续*/
{
if(-1==j||S[i]==T[j]) /*两字母相等则继续*/
{
++i;++j;
}
else /*指针后退重新开始匹配*/
{
j=next[j]; /*j退回合适的位置,i值不变*/
}
}
if(j>T_len-1) /*如果j>T_len-1表示匹配成功,返回i-T_len即为T在S中的位置*/
return i-T_len;
else
return -1; /*匹配不成功则一律返回-1*/
}
int main()
{
char T[255];
char S[255];
int next[100];
int pos;
int i=0;
printf("请输入S串:");
gets(S);
printf("请输入T串:");
gets(T);
printf("请输入初始匹配位置:");
scanf("%d",&pos);
printf("T串在S串中pos之后的位置为:%d\n",Index_KMP(S,T,pos)+1);
return 0;
}
KMP模式匹配算法
最新推荐文章于 2024-12-07 21:18:38 发布