模式匹配KMP算法实现

来源:互联网 发布:pad版软件助手 编辑:程序博客网 时间:2024/05/18 15:50

       KMP模式匹配算法原理大家可以参见任何一本数据结构课本,原理这里就不多少了。实现KMP算法主要就是根据输入的模式串构造出模式串的next数组,这个数组决定了当某一次匹配失败后应该从哪个位置开始进行匹配,因此KMP算法的精髓就是正确算出模式串的next数组。实现代码如下

在构造出next数组后就可以实现KMP算法了。这里采用源串acabaabaabcacaabc,模式串abaabcac进行测试。源代码如下:

#include <stdio.h>
#include <string.h>
#define MAXSIZE 100
int next[MAXSIZE];
int S_lenth,D_lenth;
char source[MAXSIZE],detination[100];
void get_next()
{
 int i=1,j=0;
 next[1]=0;
 while(i<=D_lenth)
 {
  if(j==0||(detination[i-1]==detination[j-1]))
  {
   ++i;
   ++j;
   next[i]=j;
  }
  else
  {
   j=next[j];
  }
 }
}
int KMP()
{
 int i=0,j=1;
 while(i<=S_lenth&&j<=D_lenth)
 {
  if(j==0||(source[i]==detination[j-1]))
  {
   ++i;
   ++j;
  }
  else
  {
   j = next[j];
  }
 }
 if(j>D_lenth)
 {
  return i-D_lenth;
 }
 else
  return 0;
}
int main()
{
 int i=0;
 printf("输入源串!!!\n");
 scanf("%s",&source);
 printf("输入模式串!!!\n");
 scanf("%s",&detination);
 S_lenth = strlen(source);
 D_lenth = strlen(detination);
 get_next();
 printf("next数组元素为:\n");
 for(i=1;i<=D_lenth;i++)
 {
  printf("%d ",next[i]);
 }
 printf("\n模式串开始于源串%d位置处",KMP());
 return 0;
}

结果如下图:

原创粉丝点击