KMP算法如何能不只匹配一次??急

来源:百度知道 编辑:UC知道 时间:2024/09/28 06:41:37
以下KMP算法如何在匹配一次后继续??
#include <stdio.h>
#include <string.h>
#define N 100
#define M 20
char s,s1,t[N],p[M];
int index_KMP(char *t,char *p,int pos);
//利用模式串的p的next函数求t在主串t中的第pos个位置之后的位置的KMP算法(p非空,1<=pos<=Strlength(s))。

void get_next(char * p,int * next);
//求模式串p的next函数的并存入数组next[]中。

//char t[20]="adjfskjfskdjsfkglsi";

//char p[5]="skdj";
void Input()
{
int i,j;

FILE *fp;
fp=fopen("原文.txt","r");

if (fp==NULL) //mark
{
printf("Failed to open the file\n");
}
else //while ((s=fgetc(fp))!=EOF) //mark
{
for (i=0;(s=fgetc(fp))!=EOF && i<N;i++) //mark
{
t[i]=s;
}
}
fclose(fp);
t[N-1] = '\0'; //m

大概看了下你的代码,关键的get_next()函数都已经得出来了,就已经成功一大半了。我先说说你的问题,你看看我理解对了就继续往下看把。

你的意思是:比如主串:abssssab 模式串:ab
第一次搜索到地址1后,继续搜索,知道又发现位置6处亦有匹配项,是不?

你的主搜索函数:index_KMP(char *t,char *p,int pos)
第三个参数指明了该函数会从pos处开始搜索,以上面为例。
主串:abssssab 模式串:ab

第一次执行ndex_KMP时候,其pos参数为0.
那么当我们找到第一个匹配项0后,说明我们再次搜索应该从目前位置向后搜索。目前位置在哪儿?当然是返回的上一地址的下一位:因此有代码:

n=index_KMP(t,p,pos); //此时从开始查找
n=index_KMP(t,p,n+1); //从一查找到的下一位开始查找。

以上