您的位置:首页 > 其它

朴素的和KMP模式匹配算法

2014-06-21 17:41 344 查看
朴素的模式匹配算法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 20
//./execute_file abcdefghijk efg 1
main(int argc,char *argv[])
{
int j=0,k=0;
int i = atoi(argv[3]); //where in S[] begin Index
printf("argv[1]=%s,len = %d\n",argv[1],strlen(argv[1]));
printf("argv[2]=%s,len = %d\n",argv[2],strlen(argv[2]));
int Slen = strlen(argv[1]);
int Tlen = strlen(argv[2]);
char S[MAXSIZE];
char T[MAXSIZE];
memcpy(S , argv[1] , Slen);
memcpy(T , argv[2] , Tlen);
while( i < Slen && j < Tlen)
{
if(S[i] == T[j])
{
i++;
j++;
} else {
i = i-j+1;
j = 0;
}
}
if(j >= Tlen)
printf("Index success,pos = %d\n", i-j);
else
return;
}


KMP模式匹配算法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 20

get_next(char *T ,int next[])
{
int i=1,j=0,k=0;
int Tlen = strlen(T);
next[0] = 0;
next[1] = 0;
while(i < Tlen)
{
printf("next while %d,T[i%d]=%c,T[j%d]=%c\n",k++,i,T[i],j,T[j]);
if(T[i] == T[j] || j==0)
{
++i;
++j;
next[i] = j;
} else {
j = next[j];
}
}
for(i=0 ; i<Tlen ; i++)
printf(" next[%d]= %d ",i,next[i]);
printf("\n");
return;
}
//./execute_file abcdefghijk efg 1
main(int argc,char *argv[])
{
int j=0,k=0;
int i = atoi(argv[3]); //where in S[] begin Index
printf("argv[1]=%s,len = %d\n",argv[1],strlen(argv[1]));
printf("argv[2]=%s,len = %d\n",argv[2],strlen(argv[2]));
int Slen = strlen(argv[1]);
int Tlen = strlen(argv[2]);
char S[MAXSIZE];
char T[MAXSIZE];
memcpy(S , argv[1] , Slen);
memcpy(T , argv[2] , Tlen);
int next[MAXSIZE];
get_next(T , next);
while( i < Slen && j < Tlen)
{
if(j == 0 || S[i] == T[j])
{
++i;
++j;
}else{
j = next[j];
}
}
if(j >= Tlen)
printf("Index success,pos = %d\n", i-j);
else
return;
}


改进的KMP模式匹配算法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXSIZE 20

get_nextval(char *T ,int *nextval)
{
int i=1,j=0;
int Tlen = strlen(T);
nextval[0] = 0;
nextval[1] = 0;
while(i < Tlen)
{
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];
}
}
for(i=0 ; i<Tlen ; i++)
printf(" nextval[%d]= %d ",i,nextval[i]);
printf("\n");
return;
}
//./execute_file abcdefghijk efg 1
main(int argc,char *argv[])
{
int j=0,k=1;
int i = atoi(argv[3]); //where in S[] begin Index
printf("argv[1]=%s,len = %d\n",argv[1],strlen(argv[1]));
printf("argv[2]=%s,len = %d\n",argv[2],strlen(argv[2]));
int Slen = strlen(argv[1]);
int Tlen = strlen(argv[2]);
char S[MAXSIZE];
char T[MAXSIZE];
memcpy(S , argv[1] , Slen);
memcpy(T , argv[2] , Tlen);
int nextval[MAXSIZE];
get_nextval(T , nextval);
while( i < Slen && j < Tlen)
{
if(j == 0 || S[i] == T[j])
{
i++;
j++;
}else{
j = nextval[j];
}
}
if(j >= Tlen)
printf("Index success,pos = %d\n", i-j);
else
return;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: