您的位置:首页 > 编程语言

KMP算法C代码描述

2005-05-06 20:35 483 查看
/*
*作者JunyiSun @ CCNU
*E-MAIL:CCNUSJY@GMAIL.COM
*KMP算法C代码描述
*/

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_S 101 /*主串的长度最大值为100*/
#define MAX_P 21 /*模式串的长度最大值为20*/

char s[MAX_S],p[MAX_P]; /*s为主串,p为模式串*/
int nextv[MAX_P]; /*p的nextv数组*/

void init_nextv()
{
int i=0,j=-1;
int p_len; /*模式串的长度*/
p_len=strlen(p);
nextv[0]=-1;
while(i<p_len-1){
if(j==-1 || p[i]==p[j]){
++i;++j;
if(p[i]!=p[j])nextv[i]=j;
else nextv[i]=nextv[j];
}
else j=nextv[j];
}
}

int kmp()
{
int i=0,j=0,s_len,p_len;
s_len=strlen(s);
p_len=strlen(p);
while(i<s_len && j<p_len){
if(j==-1 || s[i]==p[j]){
i++;j++;
}
else j=nextv[j];
}
if(j==p_len)return i-p_len;
else return -1;
}

int main()
{
int index=0;
printf("请输入主串:");
scanf("%s",s);
printf("请输入子串:");
scanf("%s",p);
init_nextv();
index=kmp();
if(index!=-1)
printf("匹配成功,匹配位置%d/n",index);
else
printf("匹配失败/n");
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: