KMP的next[]数组
KMP是众多字符串问题的基础
理解next数组尤为重要
next又称前缀数组
是 它所处位置的前一个位置的元素 与 该链 链首开始 几个元素相匹配(即相同)
举个实例来说明:
next对应的是该位置的前一个元素, 即next[i]对应a[i-1]
因为-1头指针的存在 next均对应前一个 很重要
next可以理解为指针,而它指向的位置 就是他的数值对应下标的前一个
即 比如next[7]指向a[ next[7] - 1 ], 也就是a[2] next[13]指向a[ next[13] - 1 ], 也就是a[5];
结合上一条, 也就是a[6]对应a[2] a[12]对应a[5]
这样对应的含义是: a[x]与a[y]对应,那么 从链首至a[y]的元素 均能与 a[x]及其之前 相同长度的元素匹配
举个例子 a[12]对应a[5], 也就是说 a[0]到a[5]这六个元素 能与 a[12]往前(包括a[12])共六个元素匹配 就是 a[0]到a[5] 与 a[7]到a[12] 相同
这样对应了起来有什么用呢?
这就为查找失败 往前找节约了时间。
比如, 我们在第14 这个位置查找失败了, 那么我们只需要回到next[14]这个位置也就是a[7], 看a[7]是否匹配, 若不匹配 再往前回next[7]也就是a[3]的位置
直至查找成功或者回到0
为什么呢?
因为next 数组的含义 简单的说 就是 前面有多少匹配
所以当不匹配了, 只需找到上一个匹配到哪里就可以了。
实现:
next数组的实现也是用的这个原理
1 void getnext(int len) 2 { 3 int i=0, j=-1; 4 next[0]=-1; 5 while(i<len) 6 { 7 if(j==-1 || b[i]==b[j]) 8 { 9 i++; 10 j++; 11 next[i]=j; 12 } 13 else 14 j=next[j]; 15 } 16 }
1 int kmp(int la,int lb) 2 { 3 int i=0, j=0; 4 while(i<la && j<lb) 5 { 6 if(j==-1 || a[i]==b[j]) 7 { 8 i++; 9 j++; 10 } 11 else 12 j=next[j]; 13 } 14 if(j>=lb) 15 return i-lb+1; 16 else 17 return -1; 18 }
转载于:https://www.cnblogs.com/Empress/p/4252173.html
KMP的next[]数组相关推荐
- KMP中next数组的理解
next数组是KMP的核心,但对于next数组我们总是有时候感觉明白了,但有时候又感觉没明白,现在我就说下我自己对KMP中next数组的理解,首先next[i]上的数字的意义,next[i]表示的是当 ...
- CodeForces - 1137B Camp Schedule(KMP的next数组+构造)
题目链接:点击查看 题目大意:给出一个主字符串s,再给出一个子字符串ss,主串和子串都是只由0或1所组成的字符串,现在要求重组主串s,要求重组后的字符串: 所包含的0与1的个数与之前保持一致 尽可能多 ...
- HDU - 1358 Period(KMP的next数组求最小循环节)
题目链接:点击查看 题目大意:给出一个长度为n的字符串,问有哪些前缀是周期性字符串 题目分析:因为n给的很大,所以肯定不能暴力判断了,我们可以巧妙的利用kmp的next数组进行判断,next数组有一个 ...
- HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)
题目链接:点击查看 题目大意:现在规定想要制作一串珍珠手链,需要用到两段一模一样的字符串首位相接而成,现在给定一个字符串,问最少需要添加几个珍珠才能满足条件 题目分析:一开始以为是个简单的模拟题,但后 ...
- KMP的Next数组应用总结
Next数组求法 不用初始化,因为Next数组是递推出来的.用法为getFail(s,strlen(s)). const int MAX_N=101000; char str[MAX_N],patte ...
- hdu3746 KMP的next数组应用,求项链首尾项链循环
题意: 给你一个项链,问你最少加多少个珠子能满足整个项链是一个循环的项链(首尾相连) 思路: KMP的简单应用只要了解next数组的意义就好说了,下面总结下 next在循环方面 ...
- Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)
题目链接: https://codeforces.com/contest/432/problem/D 题解: 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大 ...
- HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)
题目链接:点击查看 题目大意:给出一个字符串,现在问字符串不断向左循环所能形成的n个字符串中,字典序最小和最大的字符串的编号为多少,分别有多少个 题目分析:字符串最小表示法的模板题,证明和模板都是看大 ...
- HDU - 6153 A Secret(KMP的next数组性质/扩展KMP)
题目链接:点击查看 题目大意:给出两个字符串a和b,我们首先定义L:字符串b当前的后缀子字符串长度,N:字符串b当前的后缀在字符串a中出现的次数,现在询问,对于字符串b的每一个后缀,求出L*N之和,答 ...
最新文章
- ThreadLocal 面试六连问,你能 Hold 住吗?
- ABAP 通过sumbit调用另外一个程序使用job形式执行-简单例子
- 【洛谷 3372】线段树 1
- 八、深入JavaScript的条件语句和循环语句(四)
- 一文教你玩转链上「动森」My Neighbor Alice
- goole机器学习视频链接【学习笔记】
- CodeForces - 932G Palindrome Partition(回文自动机+Palindrome Series优化dp)
- Spark _28_窗口函数
- leetcode42 --- trap
- 信息学奥赛一本通pdf_信息学奥赛冠军的竞赛“秘籍”
- php 数据库 编程,php数据库编程(mysql mysqli pdo)
- RANGE MINIUM/MAXIUM QUERY问题
- 外汇天眼:美国10年期国债收益率创下2011年以来新高
- 微服务网关之Springcloud GateWay
- LearnOpenGL从入门到入魔(3):绘制纹理
- Android产品研发(十一)--应用内跳转Scheme协议
- 谷歌浏览器收藏栏不见了解决办法
- mac上Python版本不同时给指定的版本安装库
- java串口rxtx下载_WINDOWS环境下JAVA串口RXTX编程DEMO
- pyecharts 中应用seaborns 调色板
热门文章
- 可突破任意ARP防火墙,以限制流量为目标的简单网络管理软件
- gpupdate /force 遇报错解决过程
- 解读Go语言的2018:怎么就在中国火成这样了?
- mern技术栈好处?_通过构建运动追踪器应用程序来学习MERN堆栈(MERN教程)
- 这是如何更好地利用JavaScript数组的方法
- mysql 删除 修改密码_Mysql数据库root密码忘记了,如何在不删除Mysql的情况下修改密码...
- (C++)202012-2 期末预测之最佳阈值 满分
- JDBC连接mysql数据的7个步骤(讲解+源码)
- 学Java需要用到的软件快收藏!
- 前端工程师成长之多读好书