#include <stdio.h>
#include <string.h>
#define MAXSIZE 100
//字符串匹配
//BF暴风解法
int boyfriend(char p[],char q[])
{
int p_len,q_len;
int i=0,j=0;
p_len=strlen(p);
printf("p_len=%d\n",p_len);
q_len=strlen(q);
printf("q_len=%d\n",q_len);
while( i<p_len && j<q_len)
{
if( p[i] == q[j] )
//当前字符匹配,继续比较
{
i++;
j++;
printf("if i=%d\n",i);
printf("if j=%d\n",j);
}
else
{
i=i-j+1;
j=0;
}
}
if( q_len <= j )
{
return i-q_len+1;
}
else
return 0;
}
//KMP解法
void GetNext(char* p,int *next)
{
int pLen = strlen(p);
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1)
{
//p[k]表示前缀,p[j]表示后缀
if ( k == -1 || p[j] == p[k])
{
++k;
++j;
next[j] = k;
printf("%d",next[j]);
}
else
{
k = next[k];
}
}
}
int KMP_search(char p[],char q[])
{
int p_len,q_len;
int next[MAXSIZE]={0};
int i=0,j=0;
p_len=strlen(p);
q_len=strlen(q);
GetNext(q,next);
while( i<p_len && j<q_len)
{
if( j==-1 || p[i] == q[j] )
//当前字符匹配,继续比较
{
i++;
j++;
}
else
{
j=next[j];
}
}
if( q_len <= j )
{
return i-q_len+1;
}
else
return 0;
}
int main()
{
char p[MAXSIZE],q[MAXSIZE];
int flag;
scanf("%s",&p);
scanf("%s",&q);
flag=KMP_search(p,q);
if( flag )
{
printf("the string is in the %dth",flag);
}
else
{
printf("not find\n");
}
printf("\n%s\n",q);
return 0;
}
【数据结构与算法】BF和KMP算法
最新推荐文章于 2024-05-07 20:58:30 发布