Chinaunix首页 | 论坛 | 博客

AAA

  • 博客访问: 18432
  • 博文数量: 33
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 330
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-17 08:23
个人简介

好记性不如烂笔头,记录学习历程和随想云云,欢迎各位大虾拍砖

文章分类

全部博文(33)

文章存档

2015年(33)

我的朋友
最近访客
KMP

分类: C/C++

2015-04-30 11:03:17


    字符串匹配KMP算法解释见链接:http://kb.cnblogs.com/page/176818/

     算法实现:

点击(此处)折叠或打开

  1. /*
  2. *@brief 计算部分匹配表,即 next 数组.
  3. *
  4. *@param[inpattern 模式串
  5. *@param[outnextnext 数组
  6. *@return 无
  7. */
  8. static void computePrefix(const char* pattern, int next[])
  9. {
  10.     int i;
  11.     int j=-1;
  12.     const int m=strlen(pattern);
  13.     next[0]=j;
  14.     
  15.     for(i=1i<mi++)
  16.     {
  17.         while(j>-1 && pattern[j+1]!=pattern[i])
  18.         {
  19.             j=next[j];
  20.         }
  21.         if(pattern[i]==pattern[j+1])
  22.         {
  23.             j++;
  24.         }
  25.         next[i]=j;
  26.     }
  27. }

  28. /*
  29. *@brief KMP 算法.
  30. *
  31. *@param[intext 文本
  32. *@param[inpattern 模式串
  33. *@return 成功则返回第一次匹配的位置,失败则返回-1
  34. */
  35. static int kmp(const char* text, const char* pattern)
  36. {
  37.     int i;
  38.     int j=-1;
  39.     const int n=strlen(text);
  40.     const int m=strlen(pattern);
  41.     
  42.     if(n==0 && m==0)return 0;/*"",""*/
  43.     if(m==0)return 0;/*"a",""*/
  44.     
  45.     int* next=(int*)malloc(sizeof(int)*m);
  46.     computePrefix(patternnext);
  47.     for(i=0i<ni++)
  48.     {
  49.         while(j>-1 && pattern[j+1]!=text[i])j=next[j];
  50.         if(text[i]==pattern[j+1])j++;
  51.         if(j==m-1)
  52.         {
  53.             free(next);
  54.             next=NULL;
  55.             returni-j;
  56.         }
  57.     }
  58.     free(next);
  59.     next=NULL;
  60.     return -1;
  61. }



阅读(273) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:Isomorphic Strings

给主人留下些什么吧!~~