今天,看了KMP,首先是在网上看的,看了很久没看懂,有很多思想,很多next的推导,就相当于很多的版本,后来,去看了<<大话数据结构>>这本书,才看懂,这KMP的神奇之处,这本书写得很详细,非常好理解,对于KMP的思想,对于next的推导,next的优化,都说得比较好理解。看懂后,才惊觉,网上的很多人竟然是不懂KMP就敢写,很容易误导人,比如有的对于next的推导过程,根本就不是O(m),应该算是O(m*m)的,唉。。。看完next的推导,优化,不觉惊叹这牛逼的算法啊。其实我想说,想要看KMP,最好去看书,网上学真难。。。下面给出KMP的模板吧,也写了一点注释,要讲解KMP我也是没这么多时间,也很难讲通

对于字符串,有个 \0 结尾的特性。

KMP 测试题 http://www.cnblogs.com/haoabcd2010/p/6842448.html

 #include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAXS 5000
#define MAXT 500 char S[MAXS];
char T[MAXT];
int next[MAXT]; // 关键在于next数组的推导,next[i] 代表的意义是:如果朴素匹配失配,j 应该变为多少
//在推导next时,使用了已经推导了的next数组,所以我感觉有dp的思想在里面
void get_next(char * t,int l) //没优化但不易出错,其实不优化不会慢多少
{
int i=,j=-;
next[]=-;
while(i<l)
{
if (j==-||T[i]==T[j])
next[++i]=++j;
else
j=next[j]; //回溯
}
} /*
//优化的next很有意思,将重复的状态叠在一起了
void get_next(char * t,int l) //优化的,一定注意,要慎重使用
{
int i=0,j=-1;
next[0]=-1;
while (i<l)
{
if (j==-1||T[i]==T[j])
{
i++;j++;
if (T[i]!=T[j]) next[i]=j;
else next[i]=next[j];
}
else j = next[j];
}
}
*/ int KMP(char *s,char *t) //求匹配索引
{
int lens = strlen(s);
int lent = strlen(t);
get_next(t,lent);
int i=-,j=-;
while (i<lens&&j<lent)
{
if (j==-||S[i]==T[j])
i++,j++;
else
j = next[j]; }
if (j==lent)
return i-lent;
return -;
} int KMP_count(char *s,char *t) //求匹配数,一定要用没优化的
{
int res = ;
int lens = strlen(s);
int lent = strlen(t);
get_next(t,lent);
int i=-,j=-;
while (i<lens)
{
if (j==-||S[i]==T[j])
i++,j++;
else
j = next[j];
if (j==lent)
{
res++;
j = next[j];
}
}
return res;
} int main()
{
scanf("%s",S);
scanf("%s",T);
int p = KMP(S,T);
printf("%d\n",p);
return ;
}

最新文章

  1. javascript学习之带滚动条的图片
  2. 【转】 71道经典Android面试题和答案,重要知识点都包含了
  3. error: failed to initialize alpm library
  4. NSOJ 鬼泣
  5. Excel中的宏--VBA的简单例子
  6. Python获取两个ip之间的所有ip
  7. AppDelegate解析
  8. HDOJ(HDU) 2123 An easy problem(简单题...)
  9. [1] Spring.Net
  10. echarts之词云随机颜色的配置
  11. 快速自检电脑是否被黑客入侵过(Windows版)
  12. Java线程专栏文章汇总
  13. ABP实践(1)-通过官方模板创建ASP.NET Core 2.x版本+vue.js单页面模板-启动运行项目
  14. Java基础实训2
  15. .NET自动化测试工具链:Selenium+NUnit+ExtentReport
  16. 洛谷P2619 Tree I
  17. HttpFilter
  18. 全自动照片美化软件Photolemur mac特别版
  19. August 21st 2017 Week 34th Monday
  20. 跟着百度学习php之ThinkPHP的运行流程-1

热门文章

  1. python数据类型学习心得
  2. ElasticSearch的内存设置
  3. 2017.6.27 跟开涛学spring3--spring概述
  4. InnoDB事务和锁
  5. 跟踪运行时错误 vue
  6. 改变datagrid中指定单元格的值
  7. 解决zabbix“ZBX_NOTSUPPORTED: Timeout while executing a shell script”报错
  8. 3、Linux内核模块学习
  9. MQTT--Mosquitto的配置文件
  10. Python内置函数之super()