#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
int next[11];
void getNext(char *p)
{
memset(next,0,sizeof(next));
int i=-1,j=0;
next[0]=-1;
int len=strlen(p);
while(j<len)
{
// printf("i==%d,j==%d,next[%d]=%d\n",i,j,j,next[j]);
if((i==-1)||(p[i]==p[j]))
{
i++;
j++;
next[j]=i;
}else{
i=next[i];
}
}
}
int findIndexByKMP(char *t,char *p){
int i,j;//i表示目标串t的当前字符位置,j表示模式串p的当前字符位置
i=0,j=0;
while(t[i]!='\0'){
if(j==-1) {
i++;j++;//当头元素仍然不匹配时,j=-1,此时j指针清零,指向模式串首元素,i指向主串下一元素
}
if(p[j]=='\0')
return i-j;//当模式串走到结尾时,说明成功匹配,返回当前匹配的首字符在主串中的位置
if(t[i]==p[j]){
i++;j++; //当模式串指针与主串指针元素相同时,指向下一个元素
}else{
j=next[j];//若模式串指针与主串指针所指向的内容不同,模式串指针回退到next[j]位置(第j位发生失配)
}
}
return 0;
}
int main(int argc, char *argv[])
{
//char *p1,*t1;
// p1="abcab";
//t1="abcdddabcabdefgh";//pos= 6
char p1[100];
char t1[100];
int pos=0,i=0;
printf("输入主串t:\n");
scanf("%s",t1);
printf("输入模式串p:\n");
scanf("%s",p1);
getNext(p1);
pos=findIndexByKMP(t1,p1);
printf("结果为:%d",pos);
system("PAUSE");
return 0;
}
KMP字符串匹配算法
最新推荐文章于 2024-04-18 21:18:39 发布