一、概述

KMP算法是一种字符串匹配算法,比如现有字符串

T:ABCDABCDABCDCABCDABCDE,

P:ABCDABCDE

P字符串对应的next值:[0,0,0,0,1,2,3,4,0]

二、匹配过程

判断T字符串是否包含P字符串?下面看一下KMP的比较过程:

三、next数组计算过程

先了解一下字符串的前后缀(具体来说是前后缀即 前缀不包含最后一个字符;后缀不包含第一个字符)

字符串

真前缀

真后缀

真前、后缀中相

同的字符串

真前、后缀中

最大相同串

真前、后缀中最

大相同串字符数

abc

a,ab

bc,c

0

aaa

a,aa

aa,a

a,aa

aa

2

aba

a,ab

ba,a

a

a

1

abab

a,ab,aba

bab,ab,b

ab

ab

2

ababab

a,ab,aba,abab,ababa

babab,abab,bab,ab,b

ab,abab

abab

4

那“ABCDABCDE”字符串的最大真前后缀的计算过程如下:

子串

真前缀字符串

真后缀字符串

真前、后缀中最

大相同串字符

真前、后缀中最

大相同串字符数

A

0

AB

A

B

0

ABC

AB、A

BC、C

0

ABCD

ABC、AB、A

BCD、CD、D

0

ABCDA

ABCD、ABC、AB、A

BCDA、CDA、DA、A

A=A

1

ABCDAB

ABCDA、ABCD、ABC、AB、A

BCDAB、CDAB、DAB、AB、B

AB=AB

2

ABCDABC

ABCDAB、ABCDA、ABCD、

ABC、AB、A

BCDABC、CDABC、DABC、

ABC、BC、C

ABC=ABC

3

ABCDABCD

ABCDABC、ABCDAB、ABCDA、

ABCD、ABC、AB、A

BCDABCD、CDABCD、DABCD、

ABCD、BCD、CD、D

ABCD=ABCD

4

ABCDABCDE   

ABCDABCD、ABCDABC、ABCDAB、

ABCDA、ABCD、ABC、AB、A

BCDABCDE、CDABCDE、DABCDE、

ABCDE、BCDE、CDE、DE、E

0

 

由上表得出最大真前后缀的结果为:{0,0,0,0,1,2,3,4,0}

接下来需要把这最大真前后缀值转换为next值

索引

0

1

2

3

4

5

6

7

8

字符串

A

B

C

D

A

B

C

D

E

最大真前后缀数

0

0

0

0

1

2

3

4

0

Next

-1

0

0

0

0

1

2

3

4

通过上面的表格可以发现就是把最大真前后缀的值整体向后以后一位,所以next值为:{-1,0,0,0,0,1,2,3,4},计算出这个next数组之后,接下来在匹配的过程中就可以使用了。

注意:有的人感觉使用最大真前后缀也可以作为next值,这是可以作为的,只是在计算最大真前后缀的逻辑代码相对复杂一点点,并且在匹配使用的时候也会复杂一点点

四、实现代码

计算next值的代码

 1 public static int[] computeNext(char[] chs) {
2 int i = 0;
3 int j = -1;
4 int[] next = new int[chs.length];
5 next[i] = j;
6 while (i < chs.length - 1) {
7 if (j == -1 || chs[i] == chs[j]) {
8 i++;
9 j++;
10 next[i] = j;
11 } else {
12 j = next[j];
13 }
14 }
15 return next;
16 }

计算最大真前后缀的代码:

1 public static int[] getPreSuffix(char[] cs) {
2 int j = 0;
3 int i = 1;
4 int len = cs.length;
5 int[] preSuffix = new int[len];
6 preSuffix[1] = 0;
7 while (i < len) {
8 if (j == 0) {
9 if (cs[j] == cs[i]) {
10 preSuffix[i] = j + 1;
11 j++;
12 i++;
13 } else {
14 i++;
15 }
16 } else {
17 if (cs[j] == cs[i]) {
18 preSuffix[i] = j + 1;
19 j++;
20 i++;
21 } else {
22 j = preSuffix[j - 1];
23 }
24 }
25 }
26 return preSuffix;
27 }

大家有什么疑问、建议欢迎留言、讨论!

来去学习之---KMP算法--next计算过程的更多相关文章

  1. 学习笔记-KMP算法

    按照学习计划和TimeMachine学长的推荐,学习了一下KMP算法. 昨晚晚自习下课前粗略的看了看,发现根本理解不了高端的next数组啊有木有,不过好在在今天系统的学习了之后感觉是有很大提升的了,起 ...

  2. [一本通学习笔记] KMP算法

    KMP算法 对于串s[1..n],我们定义fail[i]表示以串s[1..i]的最长公共真前后缀. 我们首先考虑对于模式串p,如何计算出它的fail数组.定义fail[0]=-1. 根据“真前后缀”的 ...

  3. KMP算法之查找模式串在源串中出现的次数

    问题描述: 给定两个字符串T, P.查找字符串P在字符串T中出现的次数. 解决方法: 典型的KMP算法的题目,在此使用的KMP算法为算法导论上介绍的算法.下一篇文章将详细介绍KMP算法的计算过程. 题 ...

  4. 关于《数据结构》课本KMP算法的理解

    数据结构课上讲的KMP算法和我在ACM中学习的KMP算法是有区别的,这里我对课本上的KMP算法给出我的一些想法. 原理和之前的KMP是一样的https://www.cnblogs.com/wkfvaw ...

  5. KMP算法 Next数组详解

    题面 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果你不知道这是什么意思也不要问,去百 ...

  6. 字符串匹配的 KMP算法

    一般字符串匹配过程 KMP算法是字符串匹配算法的一种改进版,一般的字符串匹配算法是:从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串 ...

  7. 数据结构4_java---顺序串,字符串匹配算法(BF算法,KMP算法)

    1.顺序串 实现的操作有: 构造串 判断空串 返回串的长度 返回位序号为i的字符 将串的长度扩充为newCapacity 返回从begin到end-1的子串 在第i个字符之前插入字串str 删除子串 ...

  8. 程序员的算法课(11)-KMP算法

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/de ...

  9. KMP算法,看这篇就够了!

    普通的模式匹配算法(BF算法) 子串的定位操作通常称为模式匹配算法 假设有一个需求,需要我们从串"a b a b c a b c a c b a b"中,寻找内容为"a ...

随机推荐

  1. SPSS 相关性的选择

    在SPSS中导入数据,analyze-correlate-bivariate-选择变量 OK 输出的是相关系数矩阵 相关系数下面的Sig.是显著性检验结果的P值,越接近0越显著. 同样的数据,我们接着 ...

  2. Scrapy深度和优先级

    一.深度 配置文件 settings.py DEPTH_LIMIT = 5 二.优先级 配置文件 DEPTH_PRIORITY=1 优先级为正数时,随着深度越大,优先级越低 源码中,优先级 reque ...

  3. Django 导入配置文件

    from django.conf import settings

  4. LightningChart® .NET 8.5版重磅上线,新年特惠

    新年回馈用户 新年伊始,全球领先的数据可视化图表工具LightningChart®正式发布了.Net 8.5版本,新版软件在外观.功能和用户体验上都做了突破性的改进.LightningChart®同时 ...

  5. python实例:自动爬取豆瓣读书短评,分析短评内容

    思路: 1.打开书本“更多”短评,复制链接 2.脚本分析链接,通过获取短评数,计算出页码数 3.通过页码数,循环爬取当页短评 4.短评写入到txt文本 5.读取txt文本,处理文本,输出出现频率最高的 ...

  6. MySql配置环境变量

    完成后安装好MySQL,为MySQL配置环境变量. 0)在我的电脑上点击右键选择属性-->高级系统设置-->环境变量1)新建MYSQL_HOME变量,并配置:D:\Develop\mysq ...

  7. 3d动态文字的绘制

    在这里介绍一种3D文字的一种动态效果,可以说这是一种伪3D创建的一种3D的视觉效果 简单的讲解一下:大家或多或少都会听说过素描这种绘画手法,其实这种手法就是巧妙的利用了.阴影给人们带来的立体的视觉冲击 ...

  8. ios---设置UITabBarController的字体颜色和大小

    +(void)load{ NSMutableDictionary *attr3=[NSMutableDictionary dictionary]; attr3[NSForegroundColorAtt ...

  9. centos7.6+python3+apache2.4+django2.1.2网站部署总结

    本次网站部署是使用了django2.1.2版本部署,由于centos自带的Python2.7不支持django2.0以上版本,故需要安全python3的环境.python3.apache的安装不做具体 ...

  10. 七、django学习之聚合函数

    七.django学习之聚合函数 如何使用 from django.db.models import Avg,Max,Min,Sum models.Book.objects.all().aggregat ...