【原创】史上最透彻的KMP算法讲解

1

字符串匹配是经典的KMP算法。下面以字符串"BBC ABCDAB ABCDABCDABDE"为例,查找是否包含串"ABCDABD"?

图一

2

首先如上图,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜词"ABCDABD"的第一个字符,B与A不相等,所以后移动。

图二

3
上图中,D与空格不相等,但是它有前缀AB与后缀AB相当,KMP的思想就是利用最长的公共前缀与最长公共后缀相等,来加快每次不相等时移动的距离,来提高搜索效率。
4

要做到这一点,就是要生成一个next匹配数组,next匹配数据来决定匹配的最大长度。如图二。查next数组可知,最后一个匹配字符B对应的"部分匹配值"为2,因此后移动的位数:移动位数 = 已匹配的字符数 - 对应的部分匹配值。因为 6 - 2 等于4,所以将搜索词向后移动4位。

下面是next数组和匹配算法参照代码。

精彩内容

#include <iostream>

#include <cstring>

using namespace std;

const int N = 1000002;

int next[N];

char S[N], T[N];

int slen, tlen;

void getNext()

{

int j, k;

j = 0; k = -1; next[0] = -1;

while(j < tlen)

if(k == -1 || T[j] == T[k])

next[++j] = ++k;

else

k = next[k];

}

/*

返回模式串T在主串S中首次出现的位置

返回的位置是从0开始的。

*/

int KMP_Index()

{

int i = 0, j = 0;

getNext();

while(i < slen && j < tlen)

{

if(j == -1 || S[i] == T[j])

{

i++; j++;

}

else

j = next[j];

}

if(j == tlen)

return i - tlen;

else

return -1;

}



1.机器学习中的数据不平衡解决方案大全

2.【万字长文】AI大行其道,你准备好了吗

3.2019最新BAT、TMD等等公司技术面试题及其答案

(0)

相关推荐

  • Go 数据结构和算法篇(十二):字符串匹配之 KMP 算法

    昨天 以下文章来源于xueyuanjun ,作者xueyuanjun xueyuanjun学院君的订阅号,我会在这里持续更新优质全栈编程技术教程,包括但不限于 Golang.PHP.JavaScrip ...

  • 字符串匹配算法详解

    希望看到文章的你们,能够在今年的研究生考试中超常发挥. 愿你们都能考上自己心仪的学校,为你们的备考生涯划上一个完美的句号.做为你们的师兄有几句话想对你们说,希望这些话能对你们有一些帮助. 马上就要考试 ...

  • 史上最透彻的各类麻醉讲解(附图谱)

    口腔颌面外科门诊的临床麻醉,根据麻醉方法,麻醉药物和麻醉部位的不同,可分为局部麻醉和全身麻醉(国外在齿槽外科用笑气). 局部麻醉简称局麻,是指用局部麻醉药暂时阻断机体一定区域内神经末梢和纤维的感觉传导 ...

  • 史上最透彻的各类麻醉讲解(附图谱)!

    口腔颌面外科门诊的临床麻醉,根据麻醉方法,麻醉药物和麻醉部位的不同,可分为局部麻醉和全身麻醉(国外在齿槽外科用笑气). 局部麻醉简称局麻,是指用局部麻醉药暂时阻断机体一定区域内神经末梢和纤维的感觉传导 ...

  • 史上最透彻的各类麻醉讲解(附图谱),建议永久收藏!

    口腔颌面外科门诊的临床麻醉,根据麻醉方法,麻醉药物和麻醉部位的不同,可分为局部麻醉和全身麻醉(国外在齿槽外科用笑气). 局部麻醉简称局麻,是指用局部麻醉药暂时阻断机体一定区域内神经末梢和纤维的感觉传导 ...

  • 史上14个最快速算法:孩子的计算能力爆表...

    史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机! 计算是人们生活中经常运用的数学知识,培养小学生的计算能力尤为重要.计算在数学中占有很大的比例,计算教学是小学数学教学中的重要环节,几乎所有的 ...

  • (启书原创)史上首篇《蛴蟆节赋》,点亮那渐远的童年

    蛴蟆节赋   孟春岁首,瑞风清清, 月圆十四,玉盘茕茕. 良宵既到,炮竹振振, 华盏初夜,波光粼粼. 秧歌先闹,高跷后行, 长龙共舞,小儿牵灯. 美酒通烛,月光辉映, 别开生面,西路独盛. 缘起明末西 ...

  • 史上最牛的速算法,赶快学学吧,确实能提高...

    史上最牛的速算法,赶快学学吧,确实能提高效率#教育微头条# #知识分享#

  • 这可能是史上最全的Python算法集!

    本文是一些机器人算法(特别是自动导航算法)的Python代码合集. 其主要特点有以下三点:选择了在实践中广泛应用的算法:依赖最少:容易阅读,容易理解每个算法的基本思想.希望阅读本文后能对你有所帮助. ...

  • 史上最透彻的讲解:麦克斯韦方程组

    麦克斯韦方程组(Maxwell's equations)是英国物理学家詹姆斯·麦克斯韦在19世纪建立的一组偏微分方程,主要描述了电场.磁场与电荷密度.电流密度之间的关系. 麦克斯韦方程组里面含有4个方 ...

  • 史上最透彻关于财务分析的超级深度全解析

    一.框架分析路径商业模式.竞争优势及财务分析财务派和模式派--两种视角财务派模式派基本思路以财务报表.财务指示作为分析起点,观察公司业务经营的结果从经营模式出发,分析竞争力和未来成长空间关注因素资产的 ...