参考1: 链接

“这个是我当时学的时候学长推荐我看的”(然而太长了。。。。。我看不懂……  最后好难受_(:з」∠)_饭也不要吃的)

然后看了精简版的...然后就明白了_(:з」∠)_

【有关解释】(part)

(1)模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值
next 数组各值的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀。
  此也意味着在某个字符失配时,该字符对应的next 值会告诉你下一步匹配中,模式串应该跳到哪个位置

如果next [j] 等于0或-1,则跳到模式串的开头字符,若next [j] = k 且 k > 0,代表下次匹配跳到j 之前的某个字符,而不是跳到开头,且具体跳过了k 个字符。

(2) "部分匹配"的实质是,有时候,字符串头部和尾部会有重复。比如,"ABCDAB"之中有两个"AB",那么它的"部分匹配值"就是2("AB"的长度)。搜索字符串移动的时候,第一个"AB"向后移动4位(字符串长度-部分匹配值),就可以来到第二个"AB"的位置。

(3)(上面我也不太懂。。重点是 是拆分而不是组合吧   ABCDAB拆成 A B (x)AB AB(*) ABC DAB (x) ABCD CDAB(x)...此类,最后找到最长的

(4)“看来P[0]···P[k-1]这么长的子串是用不了了,那么我要找个同样也是P[0]打头、P[k-1]结尾的子串即P[0]···P[j-1](j==next[k-1]),看看它的下一项P[j]是否能和P[q]匹配。如图2所示”

(5)(自己的理解)

关键代码(星号)

void makeNext(const char P[],int next[])
{int q,k;//q:模版字符串下标;k:最大前后缀长度int m = strlen(P);//模版字符串长度next[0] = 0;//模版字符串的第一个字符的最大前后缀长度为0for (q = 1,k = 0; q < m; ++q)//for循环,从第二个字符开始,依次计算每一个字符对应的next值{while(k > 0 && P[q] != P[k])//递归的求出P[0]···P[q]的最大的相同的前后缀长度kk = next[k-1];          //不理解没关系看下面的分析,这个while循环是整段代码的精髓所在,确实不好理解  if (P[q] == P[k])//如果相等,那么最大相同前后缀长度加1{k++;}next[q] = k;}
}

自己理解:

 因为上一个是k-1啊,那么我们想找到的是上一个k-1出现的位置(j=next(k-1),因为是next数组里面的,所以是和前面一样的k-1出现的位置(也就是说,对于ABCF....ABCD与ABCF..ABCE在E的时候失去控制了,我们觉得ABCF...ABC这么长的用不了了,但是前面C还是可以用的,那就找到上一个出现的相同的C,(因为是相同的前缀后缀嘛,就是匹配好了的C的话前面也匹配了,刚好next里面是J

 j==next[k-1]其实是next[c],c上次出现的位置那里是ABC,因为它是最长前缀后缀所以我们知道他就是ABC,然后看那个ABCF还匹配吗?其实不匹配,然后找上一个c出现 的位置(其实已经没了),(也就是他没有相同的前后缀了) 然后就继续往后跑就可以了。

 这样整个数组跑完,可以得到完整的next数组所以叫make next嘛。。然后扔进kmp跑一下,最后跑完了字符串2的长度就是说里面可以跑完咯,那就找得到。

再结合这里:

https://www.cnblogs.com/c-cloud/p/3224788.html

会看的非常清楚明白了

代码如下(可以在vs里面跑的..x)

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
void makeNext(const char P[], int next[])
{int q, k;int m = strlen(P);next[0] = 0;for (q = 1, k = 0; q < m; ++q){while (k > 0 && P[q] != P[k])k = next[k - 1];if (P[q] == P[k]){k++;}next[q] = k;}
}void kmp(const char T[], const char P[], int next[])
{int n, m;int i, q;n = strlen(T);m = strlen(P);makeNext(P, next);for (i = 0, q = 0; i < n; ++i){while (q > 0 && P[q] != T[i])q = next[q - 1];if (P[q] == T[i]){q++;}if (q == m){printf("Pattern occurs with shift:%d\n", (i - m + 1));}}
}int main()
{int i;int next[20] = { 0 };char T[] = "ababxbabcdabdfdsss";char P[] = "abcdabd";printf("%s\n", T);printf("%s\n", P);// makeNext(P,next);kmp(T, P, next);for (i = 0; i < strlen(P); ++i){printf("%d ", next[i]);}printf("\n");return 0;
}

https://www.cnblogs.com/c-cloud/p/3224788.html

这个啊。。有人 用了个substr超时了(我也是)(针对题号FZU-2275来说的。。。 该题用kmp就可以了)

前导0

不止于此吧。.... (钉钉里有你吗  没)

。。。。看毛片算法_(:з」∠)_ /FZU - 2275相关推荐

  1. 每日一题吧算是,见证自己的成长路程_(:з」∠)_

    目录 前言: 一.整理思路: 1.照明范围: 2.明亮空地的数组思想转化: 2.1: 2.2: 二.代码的实现和细节讲解: 1.变量的定义和含义: 2.火把照明的实现: 3.萤石照明的实现 : 4.对 ...

  2. 冒泡排序代码及其思路(怕忘记才记录的_(:з」∠)_)

    代码 System.out.println("输入5个数字进行从大到小(小到大)排列:");int[] nums = new int[5];for (int i = 0; i &l ...

  3. CodeForces Canada Cup 2016 A、B水题 _(:з」∠)_

    哭哭哭哭哭哭哭 又降了4...... 这次吸取的教训是...本来就是个做题慢的傻逼....一定要准时题目一开就开始做.....不然就等着降名次吧,..... 开始四十多分钟才开进去的.....再给我四 ...

  4. 排列组合之生成排列_(:з」∠)_

    1.生成全排列 第一类:按字典序生成 参考: http://www.cnblogs.com/pmars/archive/2013/12/04/3458289.html 1.字典序法 通过一个已知排列, ...

  5. 清单革命 <<读后感>> _(:з」∠)_

    Q: 怎样能够避免犯错,让自己持续.正确.安全地做好事情? A:先读一遍清单革命,做一下总结看看. 过年在家浅显的读了一遍,以下个人观点: 一:清单是什么? 执行清单:            简单的问 ...

  6. 同余问题之中国剩余定理 _(:з」∠)_

    1.中国剩余定理又指孙子定理.叙述如下: 令m1,-,mr两两互素, b1,-,br为整数, x≡b1(mod m1),x≡b2(mod m2)--x≡br(mod mr);有唯一正整数解x,其形式为 ...

  7. KMP算法——俗称看毛片算法

    咳咳咳,这是看毛片算法的简单介绍 首推一个博客,这个博客很优秀,我的KMP算法就是从上面学来的--https://www.cnblogs.com/yjiyjige/p/3263858.html 算法思 ...

  8. cookie localStorage sessionStorage _(¦3」∠)_ 看完你居然就懂了!!!

    知识点 cookie sessionStorage localStorage cookie 本身用于浏览器和server通讯 被 "借用" 到本地存储 可用 document.co ...

  9. KMP 看毛片算法原理及其实现

    kmp算法 前言: 如何匹配字符串??? 一. 暴力匹配字符串 1.1 暴力算法描述 1.2 暴力算法实现 二. KMP算法 匹配字符串 2.1 三个概念: 最长前缀; 最长后缀; 最长公共前后缀? ...

  10. 王道数据结构课代表 - 考研数据结构 第四章 串-KMP(看毛片算法) 究极精华总结笔记(C版本)

    本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对数据结构知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!!   关于对 串 章节知识点总结的十分全面,涵括了<王道数据结构 ...

最新文章

  1. 正则表达式懒惰贪婪和replace函数
  2. 江苏专转本全国计算机一级考试成绩查询,江苏“专转本”新规:考生需获计算机一级及以上证书...
  3. python函数调用的例子_实例讲解Python中函数的调用与定义
  4. 贝叶斯统计:Inverted Beta与Three Parameter Beta分布
  5. BUUCTF(pwn)hgame2018_flag_server(简单的栈溢出)
  6. android社会化分享
  7. nokia : Booklet 3G
  8. JavaWeb:脚本标识
  9. vue data数据修改_VUE的数据响应式
  10. 入职新公司,如何快速上手公司业务?
  11. fir.im同款企业级APP分发平台系统源码
  12. 从中心到边缘,IoT正变为互联网之上的一张大网
  13. 使用HISTCONTROL强制history忽略某条特定命令
  14. android捕获全局异常,并对异常做出处理
  15. 使用 laravel Passport 做 API 认证
  16. 马万经:城市道路交通主动协同管控
  17. 模拟股票、基金账户交易周志与心得(11月1日至11月12日)
  18. 15行代码轻松绕过淘宝反爬虫机制
  19. 使用conda进行python环境管理
  20. 关于高德地图崩溃的问题

热门文章

  1. 水光半导体于2017 CES展示全方位通讯网络、多媒体及消费性电子芯片解决方案
  2. 慧荣SM2258XT、SM2259XT量产工具开启“忽略区分等级”功能
  3. 神经网络学习小记录55——Keras搭建常见分类网络平台(VGG16、MobileNet、ResNet50)
  4. 【模拟电路知识】运算放大器没有反馈电路——做电压比较器应用
  5. 计算机硬件维修的步骤和方法,计算机硬件组装与维护教程
  6. Linux不能识别usbasp,USBasp制作资料及全过程(菜鸟版)
  7. 模式识别与机器学习的简介
  8. iOS捷径(Workflow 2.0)拓展
  9. 简易局域网聊天java_简单的局域网聊天程序(java版本的)
  10. 基于SSM【爱校图书馆管理系统】附源码+论文