线性表-串:KMP模式匹配算法
一、简单模式匹配算法(略,逐字符比较即可)
二、KMP模式匹配算法
next数组:j为字符序号,从1开始。
(1)当j=1时,next=0;
(2)当存在前缀=后缀情况,next=相同字符数+1;
(3)当前缀 != 后缀且j != 1时,next=1。
如下:
abcdex
next=011111
abcabx
next=011123
ababaaaba
next=011234223
说明:0位置为情况1;
1、2位置为情况3;
3-5位置一直有前缀对称,所以一直累加;
6位置前缀不对称,j=next[ j ]找对称子串开始位置;如果没有继续j= next[ j ]直到 j = 0,next为0;
此处 i = 6, j = 4;第一次找: j = next[4] = 3, T[3] != T[6] ,没找到;第二次找: j= next[ 3 ] =1, T[2] == T[6], 找到累加 j+1 =2;
7位置同上;
8位置在7位置基础累加得到。
aaaaaaaab
next=012345678
说明:0位置为情况1;
1位置为情况3;
2-8位置一直有前缀对称,所以一直累加。
代码如下:
1: void get_next(char T[], int * next)
2: {
3: int i = 1;
4: int j = 0;
5:
6: next[1] = 0;//条件(1)
7:
8: while(i < getlength(T))
9: {
10: if(j == 0 || T[i] == T[j])
11: {
12: ++j;
13: ++i;
14: next[i] = j;//如果前缀一直有对称,则对称性累加
15: }
16: else
17: {
18: j = next[j];//如果前缀不对称,则从对称性开始的地方开始累加;
19: //如果仍然不对称,则继续从子子对称开始的地方开始累加;
20: }
21: }
22: }
23:
三、KMP模式匹配算法改进
nextval数组:j为字符序号,从1开始。
(1)当j=1时,nextval=0;
(2)当存在前缀=后缀情况,nextval=相同字符数+1;如果该字符在后缀中,则nextval = 前缀中该字符的nextval值。
(3)当前缀 != 后缀且j != 1时,nextval=1。
如下:
ababaaaba
next= 011234223
nextval=010104210
aaaaaaaab
next= 012345678
nextval=000000008
ababaaaba
next= 011234223
nextval=010104210
代码如下:
1: void get_nextval(char T[], int * nextval)
2: {
3: int i = 1;
4: int j = 0;
5:
6: nextval[1] = 0;//条件(1)
7:
8: while(i < getlength(T))
9: {
10: if(j == 0 || T[i] == T[j])
11: {
12: ++j;
13: ++i;
14: if(T[i] != T[j])
15: nextval[i] = j;//条件(3),累加
16: else
17: nextval[i] = nextval[j];//条件(2)</strong>
18: }
19: else
20: {
21: j = nextval[j];//如果前缀不对称,则从对称性开始的地方开始累加;
22: //如果仍然不对称,则继续从子子对称开始的地方开始累加;
23: }
24: }
25:
26: }
27:
转载于:https://www.cnblogs.com/lucas-hsueh/p/3711127.html
线性表-串:KMP模式匹配算法相关推荐
- java中KMP模式,Java数据结构-串及其应用-KMP模式匹配算法
串(string)是由零个或多个宇符组成的有限序列,又名叫字符串. 定义的解释: ??串中的字符数目n称为串的长度,定义中谈到"有限"是指长度n是一个有限的数值. ??零个字符的串 ...
- 串--串的定义,顺序、链式存储结构,BF、KMP模式匹配算法(C语言描述)
此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.串(String)的定义: 串(String):由零个或多个字符组成的 ...
- 第四章:2.串 -- 串的模式匹配算法(KMP)
前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 ...
- 数据结构:KMP算法 串的模式匹配算法(全网最详细)
目录 KMP模式匹配算法 简述 KMP模式匹配算法原理 如果人眼来优化的话,怎样处理 接下来我们自己来发现j的移动规律: 这一段公式证明了我们为什么可以直接将j移动到k而无须再比较前面 ...
- C/C++——朴素的模式匹配算法和KMP模式匹配算法
朴素的模式匹配算法 其实就是一个一个往下匹配,没有任何优化,在好的情况下时间复杂度为O(n+m),在最求的情况下时间复杂度为O((n-m+1)*m). 代码实现: //在主串s中找子串t,若找到返回字 ...
- 数据结构笔记(十四)-- 串的模式匹配算法
串的模式匹配算法 一.普通模式匹配算法 1.算法解析 普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果. 例如,使用普通模式匹配算法判断串 T( ...
- 也许,你可以像我这样来理解KMP模式匹配算法
本文已在本人微信公众号"码农小阿飞"上发布,打开微信搜索"码农小阿飞",或者扫描文章结尾的二维码,进入公众号并关注,就可以在第一时间收到我的推文! 前言 不管是 ...
- 朴素模式匹配与KMP模式匹配算法
一.朴素模式匹配 朴素模式匹配算法 就是遍历主串,然后把待匹配字符串与子串进行比对,先把待匹配子串的第一个字母与主串进行匹配,若匹配成功,则两串的坐标依次 ++,匹配不成功时,主串坐标返回到开始匹配时 ...
- java中KMP模式_朴素模式匹配算法、kmp模式匹配算法、kmp模式匹配算法改进。java代码...
** 朴素模式匹配算法.kmp模式匹配算法.kmp模式匹配算法改进.java代码** 思路过段时间整理~ 可以先看看阮一峰的这篇博客,字符串匹配的KMP算法 package edu.hubu.base ...
最新文章
- mysql 联接结果集函数_Oracle 中函数如何返回结果集
- SAP SD基础知识之信用风险管理概述
- linux oracle无法解析指定的连接标识符_ORA-12154: TNS: 无法解析指定的连接标识符解决...
- 在ubuntu下安装memcache
- 父元素 高度固定,如何使其中的文字垂直居中?
- 不要讨厌HATEOAS Part Deux:HATEOAS的春天
- poj-2955-Brackets-区间DP
- 华为云客户端_华为公布云手机计费清单,要不要光刻机也给出了答案
- Hash(散列)建表及查找
- ios蓝牙开发(三)app作为外设被连接的实现
- 小程序加载更多-数据的拼接
- jenkins docker 自动部署 构建_Docker_Jenkins自动部署项目
- 栗子——自定义EditText实现右下角计数控件
- spark 查看 job history 日志
- 简述神经元网络控制的作用和特点
- HierachyViewer的使用
- 【论文笔记】2022-CVPR-深度估计
- 梧桐树定制福满满养老年金,给你养老生活源源不断的现金流!
- 电视html转vga没有声音,手把手教你排除HDMI转VGA常见故障
- 使用eclipse或者myeclipse时,鼠标变成黑色十字架解决办法
热门文章
- 有什么推荐的计算机视觉项目?来自微软亚研院的清单
- 我爱计算机视觉干货集锦分类汇总(2019年3月9日)
- 国外一教授坦言,用这方法能迅速成为python程序员,但都不愿意说
- 【python教程入门学习】7个习惯提升python效率
- 超强!MDETR:基于Transformer的端到端目标检测神器!开源!
- php如何利用soap查看函数,使用PHP soap函数的自定义标题
- 一文初探Tensorflow高级API使用(初学者篇)
- 深度学习(五十八)caffe移植至mxnet
- 佩斯大学计算机科学世界排名,美国佩斯大学留学推荐 计算机科学专业
- java w732_技术联盟W732系统下载