KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。

个人心得:比较好理解,只要了解前缀和后缀就好了,就是代码实现得太巧妙太抽象,难以体会和想到,不得不佩服!

KMP算法的关键在于next数组的创建和子字符串的匹配;

next数组里面存放的是要查找的字符串前i个字符串的所有前缀、后缀相等的公共串中,最大的长度值。比如需要查找的一个子串ababcd,next[0]表示子串中前1个字符串即a的前缀和后缀中相等字符串的最大长度,因为a的前缀和后缀没有,故next[0] = 0;对于next[2],即先求出子串aba的前缀和后缀出来,前缀为a,ab,后缀有ba,a,相等的公共串为a,长度为1,因此next[2] = 1;依次可以求出。

 void getnext(int x[],int next[])
{
int i=;
int j=-;
next[i]=-;
while(i<m)
{
if(j==-||x[i]==x[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}

然后就是字符串的对比了,注意j=-1只会出现一次,以后就是每次的跳转了,根据对应的next实现代码优化

 int i=,j=;
while(i<=n&&j<m)
{
if(j==-||a[i]==b[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j==m) flag=;
else flag=-;

最新文章

  1. 日志文件清理工具V1.1
  2. 重制AdvanceWars第一步 -- 搞定地图
  3. mac系统如何显示和隐藏文件
  4. 【POJ2096】Collecting Bugs 期望
  5. AFNetworking使用方法
  6. Native OR WebApp ?
  7. EasyUI--messager
  8. java 、android 知识图谱
  9. 读取svg图片为UIBezierPath,开心做动画
  10. LightOJ 1074 Extended Traffic (最短路spfa+标记负环点)
  11. libevent学习之二:Windows7(Win7)下编译libevent
  12. .NET Core初体验 - 在Mac下运行第一个Web示例程序
  13. 前端SEO优化
  14. SurfaceView的一个小应用:开发示波器
  15. Cocos2d-x学习笔记(19)(TestCpp源代码分析-3)
  16. Ubuntu14.04: Error found when loading /root/.profile
  17. [bzoj5015][Snoi2017]礼物
  18. Python 表示无穷大的数
  19. Effective C++ ——实现
  20. 51nod97B 异或约束和

热门文章

  1. shell set 命令
  2. IMX6Q RTC驱动分析
  3. python中编写带参数decorator
  4. com.android.dex.DexIndexOverflowException: Cannot merge new index 66299 into a non-jumbo instruction
  5. Nagios 服务安装
  6. Linux设置默认启动命令行,而不是图形界面
  7. ACM训练小结-2018年6月16日
  8. Django详解之四、cookie和session
  9. ADO.Net连接Oracle
  10. 正则表达式java,javaScript应用