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[]数组相关推荐

  1. KMP中next数组的理解

    next数组是KMP的核心,但对于next数组我们总是有时候感觉明白了,但有时候又感觉没明白,现在我就说下我自己对KMP中next数组的理解,首先next[i]上的数字的意义,next[i]表示的是当 ...

  2. CodeForces - 1137B Camp Schedule(KMP的next数组+构造)

    题目链接:点击查看 题目大意:给出一个主字符串s,再给出一个子字符串ss,主串和子串都是只由0或1所组成的字符串,现在要求重组主串s,要求重组后的字符串: 所包含的0与1的个数与之前保持一致 尽可能多 ...

  3. HDU - 1358 Period(KMP的next数组求最小循环节)

    题目链接:点击查看 题目大意:给出一个长度为n的字符串,问有哪些前缀是周期性字符串 题目分析:因为n给的很大,所以肯定不能暴力判断了,我们可以巧妙的利用kmp的next数组进行判断,next数组有一个 ...

  4. HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)

    题目链接:点击查看 题目大意:现在规定想要制作一串珍珠手链,需要用到两段一模一样的字符串首位相接而成,现在给定一个字符串,问最少需要添加几个珍珠才能满足条件 题目分析:一开始以为是个简单的模拟题,但后 ...

  5. KMP的Next数组应用总结

    Next数组求法 不用初始化,因为Next数组是递推出来的.用法为getFail(s,strlen(s)). const int MAX_N=101000; char str[MAX_N],patte ...

  6. hdu3746 KMP的next数组应用,求项链首尾项链循环

    题意:       给你一个项链,问你最少加多少个珠子能满足整个项链是一个循环的项链(首尾相连) 思路:      KMP的简单应用只要了解next数组的意义就好说了,下面总结下  next在循环方面 ...

  7. Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)

    题目链接: https://codeforces.com/contest/432/problem/D 题解: 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大 ...

  8. HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)

    题目链接:点击查看 题目大意:给出一个字符串,现在问字符串不断向左循环所能形成的n个字符串中,字典序最小和最大的字符串的编号为多少,分别有多少个 题目分析:字符串最小表示法的模板题,证明和模板都是看大 ...

  9. HDU - 6153 A Secret(KMP的next数组性质/扩展KMP)

    题目链接:点击查看 题目大意:给出两个字符串a和b,我们首先定义L:字符串b当前的后缀子字符串长度,N:字符串b当前的后缀在字符串a中出现的次数,现在询问,对于字符串b的每一个后缀,求出L*N之和,答 ...

最新文章

  1. ThreadLocal 面试六连问,你能 Hold 住吗?
  2. ABAP 通过sumbit调用另外一个程序使用job形式执行-简单例子
  3. 【洛谷 3372】线段树 1
  4. 八、深入JavaScript的条件语句和循环语句(四)
  5. 一文教你玩转链上「动森」My Neighbor Alice
  6. goole机器学习视频链接【学习笔记】
  7. CodeForces - 932G Palindrome Partition(回文自动机+Palindrome Series优化dp)
  8. Spark _28_窗口函数
  9. leetcode42 --- trap
  10. 信息学奥赛一本通pdf_信息学奥赛冠军的竞赛“秘籍”
  11. php 数据库 编程,php数据库编程(mysql mysqli pdo)
  12. RANGE MINIUM/MAXIUM QUERY问题
  13. 外汇天眼:美国10年期国债收益率创下2011年以来新高
  14. 微服务网关之Springcloud GateWay
  15. LearnOpenGL从入门到入魔(3):绘制纹理
  16. Android产品研发(十一)--应用内跳转Scheme协议
  17. 谷歌浏览器收藏栏不见了解决办法
  18. mac上Python版本不同时给指定的版本安装库
  19. java串口rxtx下载_WINDOWS环境下JAVA串口RXTX编程DEMO
  20. pyecharts 中应用seaborns 调色板

热门文章

  1. 可突破任意ARP防火墙,以限制流量为目标的简单网络管理软件
  2. gpupdate /force 遇报错解决过程
  3. 解读Go语言的2018:怎么就在中国火成这样了?
  4. mern技术栈好处?_通过构建运动追踪器应用程序来学习MERN堆栈(MERN教程)
  5. 这是如何更好地利用JavaScript数组的方法
  6. mysql 删除 修改密码_Mysql数据库root密码忘记了,如何在不删除Mysql的情况下修改密码...
  7. (C++)202012-2 期末预测之最佳阈值 满分
  8. JDBC连接mysql数据的7个步骤(讲解+源码)
  9. 学Java需要用到的软件快收藏!
  10. 前端工程师成长之多读好书