Chinaunix首页 | 论坛 | 博客
  • 博客访问: 273915
  • 博文数量: 18
  • 博客积分: 787
  • 博客等级: 军士长
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-27 21:20
文章分类

全部博文(18)

文章存档

2015年(2)

2013年(2)

2012年(7)

2011年(1)

2010年(6)

分类: C/C++

2013-10-04 12:06:18

以下为KMP代码实现,KMP算法的说明详见算法导论32.4节

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int *ComputePrefixFunc(char *p)
  5. {
  6.     int len = strlen(p);
  7.     int k=-1, i=1;
  8.     int *next = (int*)calloc(len, sizeof(int));
  9.     next[0] = -1;
  10.     for(i=1; i<len; i++)
  11.     {
  12.         while(k>=0 && p[i]!=p[k+1])
  13.             k = next[k];
  14.         if(p[k+1]==p[i])
  15.             k++;
  16.         next[i] = k;
  17.     }

  18.     printf("Next:");
  19.     for(i=0; i<len; i++)
  20.     {
  21.         printf(" %d", next[i]);
  22.     }
  23.     printf("\n");
  24.     return next;
  25. }

  26. void KMP_matcher(char *input, char *pattern, int *next)
  27. {
  28.     int slen = strlen(input);
  29.     int plen = strlen(pattern);
  30.     int i,j,k;
  31.     int q=-1;
  32.     for(i=0; i<slen; i++)
  33.     {
  34.         while(q>=0 && pattern[q+1]!=input[i])
  35.             q = next[q];
  36.         if(pattern[q+1]==input[i])
  37.             q++;
  38.         if(q==plen-1)
  39.         {
  40.             printf("Match position: %d\n", i-plen+1);
  41.             q = next[q];
  42.         }
  43.     }
  44. }

  45. int main()
  46. {
  47.     char input[1024];
  48.     char pattern[1024];
  49.     int *next = NULL;
  50.     int i,j,k;
  51.     while(scanf("%s%s", input, pattern)>0)
  52.     {
  53.         next = ComputePrefixFunc(pattern);
  54.         KMP_matcher(input, pattern, next);
  55.         free(next);
  56.         next = NULL;
  57.     }
  58. }

阅读(2009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~