KMP算法(改进的模式匹配算法)——next函数
KMP算法简介
KMP算法是在基础的模式匹配算法的基础上进行改进得到的算法,改进之处在于:每当匹配过程中出现相比较的字符不相等时,不需要回退主串的字符位置指针,而是利用已经得到的部分匹配结果将模式串向右“滑动”尽可能远的距离,再继续进行比较。在KMP算法中,依据模式串的next函数值实现字串的滑动,本随笔介绍next函数值如何求解。
next[ j ]求解
将 j-1 对应的串与next[ j-1 ]对应的串进行比较,若相等,则next[ j ]=next[ j-1 ]+1;若不相等,则将 j-1 对应的串与next[ next[ j-1 ]]对应的串进行比较,一直重复直到相等,若都不相等则为其他情况
题1
在字符串的KMP模式匹配算法中,需先求解模式串的函数值,期定义如下式所示,j表示模式串中字符的序号(从1开始)。若模式串p为“abaac”,则其next函数值为()。

解:j=1,由式子得出next[1]=0;
j=2,由式子可知1<k<2,不存在k,所以为其他情况即next[2]=1;
j=3,j-1=2 对应的串为b,next[2]=1,对应的串为a,b≠a,那么将与next[next[2]]=0对应的串进行比较,0没有对应的串,所以为其他情况,也即next[3]=1;
j=4,j-1=3 对应的串为a,next[3]=1,对应的串为a,a=a,所以next[4]=next[3]+1=2;
j=5,j-1=4 对应的串为a,next[4]=2,对应的串为b,a≠b,那么将与next[next[4]]=1对应的串进行比较,1对应的串为a,a=a,所以next[5]=next[2]+1=2;
综上,next函数值为 01122。
题2
在字符串的KMP模式匹配算法中,需先求解模式串的函数值,期定义如下式所示,j表示模式串中字符的序号(从1开始)。若模式串p为“tttfttt”,则其next函数值为()。

解:
j=1,由式子得出next[1]=0;
j=2,由式子可知1<k<2,不存在k,所以为其他情况即next[2]=1;
j=3,j-1=2 对应的串为t,next[2]=1,对应的串为t,t=t,所以next[3]=next[2]+1=2;
j=4,j-1=3 对应的串为t,next[3]=2,对应的串为t,t=t,所以next[4]=next[3]+1=3;
j=5,j-1=4 对应的串为f,next[4]=3,对应的串为t,f≠t,那么将与next[next[4]]=2对应的串进行比较,2对应的串为t,f≠t。继续和next[2]=1对应的串对比,序号为1也就是第一个串对应的串为t,同样f≠t,到此所以对比已结束,均不相等,所以为其他情况,next[5]=1;
j=6,j-1=5 对应的串为t,next[5]=1,对应的串为t,t=t,所以next[6]=next[5]+1=2;
j=7,j-1=6 对应的串为t,next[6]=2,对应的串为t,t=t,所以next[7]=next[6]+1=3;
综上,next函数值为0123123。
最后附上求模式串的next函数,如下
*求模式串p的next函数值,并存入数组next
void Next(char *p,int next[])
{
int i,j,len;
len=strlen(p);
i=0;
next[0]=-1;
j=-1;
while(i<len)
{
if(j==-1||p[i]==p[j]){++i;++j;next[i]==j;}
else j=next[j];
}
}
KMP算法(改进的模式匹配算法)——next函数的更多相关文章
- 浅谈数据结构之KMP(串中的模式匹配算法)
KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的 ...
- KMP算法(改进后的字符串匹配算法)
转载:http://blog.csdn.net/liu88010988/article/details/50789960 kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O ...
- 问题 1690: 算法4-7:KMP算法中的模式串移动数组
题目链接:https://www.dotcpp.com/oj/problem1690.html 题目描述 字符串的子串定位称为模式匹配,模式匹配可以有多种方法.简单的算法可以使用两重嵌套循环,时间复杂 ...
- BF算法(串模式匹配算法)
主串和子串 主串与子串:如果串 A(如 "shujujiegou")中包含有串 B(如 "ju"),则称串 A 为主串,串 B 为子串.主串与子串之间的关系可简 ...
- KMP算法之查找模式串在源串中出现的次数
问题描述: 给定两个字符串T, P.查找字符串P在字符串T中出现的次数. 解决方法: 典型的KMP算法的题目,在此使用的KMP算法为算法导论上介绍的算法.下一篇文章将详细介绍KMP算法的计算过程. 题 ...
- 【原创】通俗易懂的讲解KMP算法(字符串匹配算法)及代码实现
一.本文简介 本文的目的是简单明了的讲解KMP算法的思想及实现过程. 网上的文章的确有些杂乱,有的过浅,有的太深,希望本文对初学者是非常友好的. 其实KMP算法有一些改良版,这些是在理解KMP核心思想 ...
- 串的模式匹配算法(求子串位置的定位函数Index(S,T,pos))
串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字 符起,检验是否存在子串T.首先令i 等于 pos(i 为S 中当前待比较字符的位序),j 等于 1(j ...
- 串、KMP模式匹配算法
串是由0个或者多个字符组成的有限序列,又名叫字符串. 串的比较: 串的比较是通过组成串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号. 计算机中常用的ASCII编码,由8位二进制 ...
- KMP算法的next函数求解和分析过程
转自 wang0606120221:http://blog.csdn.net/wang0606120221/article/details/7402688 假设KMP算法中的模式串为P,主串为S,那么 ...
随机推荐
- Vue.js 开发实践:实现精巧的无限加载与分页功能
本篇文章是一篇Vue.js的教程,目标在于用一种常见的业务场景--分页/无限加载,帮助读者更好的理解Vue.js中的一些设计思想.与许多Todo List类的入门教程相比,更全面的展示使用Vue.js ...
- .map() vs .forEach() vs for() 如何选择?
访问原文地址 .map() vs .forEach() vs for() 笔者说,自己基本没怎么用过for()来遍历,主要是用.forEach(). 但是总是会被很多朋友说,这些人认为for()的速度 ...
- SDT v0.0.1 上线
自己的第一个开源组件,断断续续写了有一段时间,感觉可以发布 v0.0.1.SDT 是 SVG Drag Tree 的缩写,一个可以通过拖放 SVG 图标,来生成拥有树形结构的视图与相应数据的前端组件. ...
- python-统计字符个数
输入一个字符串,统计其中数字字符及小写字符的个数 输入格式: 输入一行字符串 输出格式: 共有?个数字,?个小写字符 输入样例: helo134ss12 输出样例: 共有5个数字,6个小写字符 代码: ...
- 存储过程 psal emp.sal%type是什么意思
psal emp.sal%type 就是指psal这个变量是引用了表emp中的sal字段的类型.如果emp表中sal的类型变了,psal这个字段的类型也会跟着变化,总之,psal和表emp中sal字段 ...
- iframe引入微信公众号文章
微信在文章页面设置了响应头""frame-ancestors 'self'"阻止了外部页面将其嵌套的行为,文章的图片也设置了防盗链的功能,这就导致了直接在iframe中引 ...
- Math类、Random类、System类、BigInteger类、BigDecimal类、Date类、SimpleDateFormat、Calendar类
Math类* A:Math类概述 * Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数. * B:成员方法 * public static int abs(int a) ...
- CTF大赛模拟-CFS三层内网漫游
CTF大赛模拟-CFS三层内网漫游 环境: 三台虚拟机,三个网络. target 1:192.168.161.178 ,192.168.52.132 (linux) target 2:192.168. ...
- 基于File NIO写的一个文件新增内容监控器
基于File NIO写的一个文件新增内容监控器 需求说明 监控一个文件,如果文件有新增内容,则在控制台打印出新增内容. 代码示例 FileMoniter文件监控器类 package com.black ...
- android软件简约记账app开发day03-自定义键盘的书写
android软件简约记账app开发day03-自定义键盘的书写 我们在fragment界面使用了自定义的keybroad键盘,所以今天我们来书写自定义的键盘代码 新建util包,新建keyboard ...