网上之所以有这么多版本的KMP算法,是因为有的人写的是最大长度串版本的,有的人写的是next数组版本的(具体区别看下面博文),有的人写的是next优化版的,有的人写的是未优化的,不同人写的循环方法不同,这些写法间的效率是有一定区别的

KMP算法具体讲解看这篇博客,讲的非常非常详细:

https://blog.csdn.net/v_july_v/article/details/7041827#

重点应该在理解Next数组和Next数组的优化

我试着再写一下我理解的优化过程:

比如这张图:

设上面的串为A[],下面的串为B[],下标从0开始

根据最大长度串数组C的定义:

当前子串字符之前的字符串中,有多大长度的相同前缀后缀。例如如果C [j] = k,代表j 之前的字符串中有最大长度为k 的相同前缀后缀。

对于abab这个子串来说,最大长度串数组C就是0 0 1 2,那么next数组(未优化版)就是最大长度值整体向右移动一位,然后初始值赋为-1,即-1 0 0 1。

我们会发现当发生A[3]c与B[3]b失配后,左移两位(3-next[3])后,会A[3]c会再次与B[1]b失配,事实上这是必然发生的,

回看next数组的定义(其实也就是最大长度串数组):j 之前的字符串中有最大长度为k 的相同前缀后缀。既然后缀的这个字符已经失配了,那么前缀相同地方的字符也一定会失配,所以要避免这个情况发生,也就是若:B[j] = B[ next[j] ]就要让B[j] = B[ next[j] ]。

总结一下这个过程:

先求出最大长度串数组,整体左移一位,若B[j] = B[ next[j] ]即B[j] = B[ next[j] ]

最后给出一个nenxt优化版本的代码

 int a[];
int b[];
int len1, len2;
int Next[];
void getNext()
{
int k = -, j = ;
Next[] = -;
while(j < len2)
{
if(k == - || b[j] == b[k])
{
k++;
j++;
if(b[j] != b[k])
Next[j] = k;
else//如果这一步失败 那么同值的也会失败
Next[j] = Next[k];
}
else
k = Next[k];
}
}
int kmp()
{
getNext();
int i = , j = ;
while(i < len1)
{
if(j == - || a[i] == b[j])
{
i++;
j++;
}
else
j = Next[j];
if(j == len2)
return i+-len2;
//返回的是匹配到的index,如果是求次数或对错的话需要修改
}
return -;
}

KMP算法不同写法之间区别的更多相关文章

  1. Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化

    1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...

  2. KMP算法的一次理解

    1. 引言 在一个大的字符串中对一个小的子串进行定位称为字符串的模式匹配,这应该算是字符串中最重要的一个操作之一了.KMP本身不复杂,但网上绝大部分的文章把它讲混乱了.下面,咱们从暴力匹配算法讲起,随 ...

  3. 字符串模式匹配KMP算法

    一篇不错的博客:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html KMP字符串模式匹配通俗点说就是一种在一个字符串中 ...

  4. KMP算法深入解析

    本文主要介绍KMP算法原理.KMP算法是一种高效的字符串匹配算法,通过对源串进行一次遍历即可完成对字符串的匹配. 1.基础知识的铺垫 字符串T的前k(0 =< k <=tlen)个连续的字 ...

  5. 字符串匹配KMP算法详解

    1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...

  6. KMP算法详细分解

    1. 引言 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的 ...

  7. 算法 kmp算法

    kmp算法是改进后的字符匹配算法,它与bf算法的区别是,每次从串与主串匹配失败后,从串与主串匹配的位置不同. 下面具体说下这两种算法的区别: 主串:BABCDABABCDABCED 从串:ABCDAB ...

  8. KMP算法的next函数求解和分析过程

    转自 wang0606120221:http://blog.csdn.net/wang0606120221/article/details/7402688 假设KMP算法中的模式串为P,主串为S,那么 ...

  9. 从头到尾测地理解KMP算法【转】

    本文转载自:http://blog.csdn.net/v_july_v/article/details/7041827 1. 引言 本KMP原文最初写于2年多前的2011年12月,因当时初次接触KMP ...

随机推荐

  1. 关于HTML标签中的一些容易忘记常用样式属性

    样式说明--样式: margin, margin-top/left/bottom/right -- 外边距; padding, padding-top/left/botton/right -- 内边距 ...

  2. web聊天相关知识

    http相关知识 http是无状态,请求,响应模式的通信模式,就是用户每次通过浏览器点击一下页面,都需要重新与web服务器建立一下连接,且发送自己的 session id 给服务器端以使服务器端验证此 ...

  3. DCloud-MUI:HBuilder 安装

    ylbtech-DCloud-MUI:HBuilder 安装 1.返回顶部 1. 2. 3. 4. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返 ...

  4. Pythonb编码规范

    本编码规范是对知道创宇研发技能表中提供的PythonCodingRule.pdf文档进行凝练和总结出来的结果,感谢知道创宇的Geek精神与分享精神 此规范较为严格,严格规定了编码格式和命名规则,仅适于 ...

  5. SpringMVC—对Ajax的处理(含 JSON 类型)(1)

    一.首先要搞明白的一些事情. 1.从客户端来看,需要搞明白: (1)要发送什么样格式的 JSON 数据才能被服务器端的 SpringMVC 很便捷的处理,怎么才能让我们写更少的代码,如何做好 JSON ...

  6. [phonegap]安装升级

    安装 npm install -g phonegapnpm install -g phonegap@版本号    比如 npm install -g phonegap@3.3.0-0.19.6 升级 ...

  7. 微信小程序的组件总结

    本文介绍微信小程序的组件 视图容器 基础内容 表单组件 导航组件 媒体组件 视图容器 view 布局容器 <view hover-class='bg'>222</view> 可 ...

  8. oracle错误-ORA-12519, TNS:no appropriate service handler found

    转自:https://blog.csdn.net/u013147600/article/details/48380841

  9. 控制器对应view生命周期

    一.控制器view创建的六种方式 1.有没有同名xib创建2.通过 storyboard 创建3.有指定xib情况下创建4.有同名xib情况5.有同名去掉controll的情况6.loadveiw   ...

  10. C#高级参数params的使用

    params,可变参数,使用十分简单,看代码吧. using System; using System.Collections.Generic; using System.Linq; using Sy ...