KMP之计算Next数组
KMP的Next数组:模式串的前缀与后缀的“相交”长度
KMP算法步骤:
1.先算next数组
2.若失配(此时模式串下标为j),利用Next数组求出失配后滑动的新位置
a.Next[j] \geq 0,则模式串右移 j-Next[j] 位
b.Next[j] = -1,则模式串右移 j+1 位

初始 i = 0, j = -1,Next[ 0 ] = -1(为了后面计算方便);
Step1:
由于j == -1,i&j++,且Next[i] = j,即Next[1] = 0; 此时 i = 1, j = 0;
下一个循环:p[ i ] != p[ j ],所以 j = Next[ j ] = Next[ 0 ] = -1,j回退
j == -1, i&j++,此时 i = 2, j = 0; Next[ i ] = j,即Next [ 2 ] = 0
Step2:
p [ 2 ] == p [ 0 ] -> i&j++ -> i = 3, j = 1, Next[ 3 ] = 1;
Step3:
p [ 3 ] == p [ 1 ] -> i&j++ -> i = 4, j = 2, Next[4] = 2;
Step4:
p [ 4 ] == p [ 2 ] -> i&j++ -> i = 5, j = 3, Next[5] = 3;
Step5:
p [ 5 ] == p [ 3 ] -> i&j++ -> i = 6, j = 4, Next[6] = 4;
Step6:
p [ 6 ] != p [ 4 ] -> 失配! -> j = Next[ j ] = Next [ 4 ] = 2
Step7:
p [ 6 ] != p [ 2 ] -> 失配! -> j = Next[ j ] = Next [2 ] = 0
Step8:
p [ 6 ] != p [ 0 ] -> 失配! -> j = Next[ j ] = Next [0 ] = -1
Step9:
j == -1 -> i&j++ -> i = 7, j = 0 -> Next[7] = 0
Step10:
p [ 7 ] != p [ 0 ] -> 失配! -> j = Next[ j ] = Next [0 ] = -1
Step11:
i !< strlen(p) -> 循环退出
int next[100] = { 0 };
void calNext(char *p, int *next)
{
next[0] = -1;
int i = 0, j = -1;
while (i < strlen(p)) {
if (j == -1 || p[i] == p[j]) //短路
{
i++;
j++;
next[i] = j;
}
else //j指针回退过程
j = next[j];
}
}
KMP之计算Next数组的更多相关文章
- 【字符串匹配】KMP算法和next数组的c/c++实现
KMP算法基本思想有许多博客都写到了,写得也十分形象,不懂得可以参考下面的传送门,我就不解释基本思想了.本文主要给出KMP算法及next数组的计算方法(主要是很多网上的代码本人(相信应该是许多人吧)看 ...
- KMP算法中next数组的理解与算法的实现(java语言)
KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧. 计算前缀 Next[i] 的值: ...
- 计算字符数组长度,用strlen 与 sizeof 的原理与区别
遇到个坑,定义了一个字符数组 unsigned ;i<;i++) { buff[i] = ; } 然后用串口发送函数: write(fd, buff, strlen(buff)); 却发现串口一 ...
- poj 2406:Power Strings(KMP算法,next[]数组的理解)
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 30069 Accepted: 12553 D ...
- KMP(构建next数组)
字符串匹配算法KMP, 核心思想是尽可能利用已经匹配的结果, 跳过尽可能多的不需要匹配的情况 重点和难点都在next数组的建立上 1. KMP算法的next数组求解 以模式串 a b a c a b ...
- KMP算法的next[]数组通俗解释
原文:https://blog.csdn.net/yearn520/article/details/6729426 我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以 ...
- hdu 1358:Period(KMP算法,next[]数组的使用)
Period Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- 【LOJ#2507】[CEOI2011]Matching(KMP,树状数组)
[LOJ#2507][CEOI2011]Matching(KMP,树状数组) 题面 LOJ 题解 发现要做的是排名串的匹配. 然后我们考虑把它转成这个位置之前有多少个数小于当前这个数,这样子只要每个位 ...
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
字符数组的长度计算:必须以终止符’\0'作为边界,但对字符数组赋值时,有两种方式: 1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'} ...
随机推荐
- Java多线程之静态代理
package org.study2.javabase.ThreadsDemo.staticproxy; /** * @Date:2018-09-18 静态代理 设计模式 * 1.真实角色 * 2.代 ...
- Jenkins+PowerShell持续集成环境搭建(七)构建触发器
Jenkins 有三种类型的构建触发器,如下图: Build after other projects are built:在其他项目构建后构建: Build periodically:定时构建: P ...
- Nginx TSL/SSL优化握手性能
L:131
- Nginx Tcp四层反向代理
L:117 //nginx反向代理代码 server{ listen ; proxy_pass localhost:; //指向上游服务器 proxy_protocol on; //启用对上游传递协议 ...
- Civil 3D 二次开发 创建Civil 3D 对象—— 00 ——
本节中我们通过创建几何空间点.曲面和采样线了解Civil 3D对象的创建方法.因Civil 3D对象的创建方法相比AutoCAD对象创建要简单的多,比如创建一个几何空间点,最简单的情况采用一行代码(没 ...
- SpringBoot之get请求404
后台:SpringBoot 前台:VUE 异常:调get接口,返回404 场景:get请求传参,后台返回n条数据,不传参则返回所有 原因:原请求url为"~/one/{param}" ...
- 数据库管理 trove openstack
Trove是数据库即服务的OpenStack.它旨在完全基于OpenStack运行,其目标是允许用户快速轻松地利用关系数据库的功能,而无需处理复杂的管理任务.云用户和数据库管理员可以根据需要配置和管理 ...
- [IOI2018]组合动作——构造
题目连接: [IOI2018]combo 题目大意:有一个未知的长度为n的字符串$T$,只包含$A,B,X,Y$四个字符且首字母只出现一次,每一次你可以询问一个长度不超过$4n$的字符串$S$,交互库 ...
- Codeforces1036G Sources and Sinks 【构造】【状态压缩】
题目分析: 考虑一个源点集合$S$,如果$S$能到的点$T$比$S$小,那么$T$全连到$S$里面,其它点就到不了$T$啦.否则我们全连完后$S$集合被迫扩大,所以总能扩大满. 代码: #includ ...
- LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】
题目分析: 题目要求前后缀相同,把串反过来之后是一个很明显的卷积的形式.这样我们可以完成初步判断(即可以知道哪些必然不行). 然后考虑一下虽然卷积结果成立,但是存在问号冲突的情况. 箭头之间应当不存在 ...