对于多数算法理解了算法的意思与过程方式,基本就了解了一大半,但是,但是当我自己写next[]时人还是懵的,上百度,可是还是有些不理解,最后看到一个博主他的经历和我差不多他把他经历讲了一遍,说看书碰到p.str[i]!=p.str[j],j就要回退,书上一开始就是这样,我看的有点懵圈,最后我就按照算法一个个来,经过脑子一大圈转弯之后终于理解了,首先得了解为什么要创建next[],
下面void getnext(seqstring p, int next[])就是从开头开始,就是前缀和后面地一直比较事否相等,如果相等,就往后一起移动,否则,前面地比较要回溯到初始开始在和后面比较,就可以了,这是我自己理解地最接地气地解释了,第一次自己把自己地想法来分享下。fighting!!
#include <stdio.h>
# define max 100
typedef struct{
char str[max];
int length ;
}seqstring;
void getnext(seqstring p, int next[]) //next[]值的计算 和输出next【】值
{
int i,j;
next[0]=-1; i=0; j=-1;
while( i<p.length )
{ if( j==-1 || p.str[i]==p.str[j] )
{ ++i; ++j; next[i]=j; }
else j=next[j];
}
for(i=0;i<p.length;i++)
printf("%5d", next[i]);
}
int kmp(seqstring t /*主串*/, seqstring p /*模式串*/, int next[])
{
int i=0,j=0;
while ( i<t.length && j<p.length )
{ if( j==-1 || t.str[i]==p.str[j] )
{ i++; j++; }
else j=next[j];
}
if ( j==p.length ) return (i-p.length);
else return(-1);
}
seqstring insert(seqstring p) //储存字符串
{
char x;
scanf("%c",&x);
int i=0;
while(x !='#')
{
p.str[i++]=x;
p.length=i;
scanf("%c",&x);
}
i--;
printf("\n");
return p;
}
int main()
{
seqstring a,b;
printf("请输入模式串且模式串小于max(以 ’#‘ 结束\n");
a=insert(a);
int next[max];
getnext( a,next);
printf("\n请输入主串(以#结束)\n");
b=insert(b);
int k;
k=kmp( b,a, next);
if(k==-1)
printf("匹配失败\n");
else
printf("匹配位置在第%d位置上\n",k);
}


京公网安备 11010502036488号