例子

                         ↓(不匹配位置 6)

T串:a b c a b c (i 表示位置)

S串:a b c a b d aaaaaaa (j 表示位置)

位置: 1 2 3 4 5 6

则 匹配到 a b c a b 则 i5 = j5 ≠ j4 ≠ j3 = j2 ≠ j1

所以因为 i5 与 j4 j3 都不相等 所以直接跳过 i5不与 j4 j3 匹配 直接与 j2 匹配

#include<iostream>
#include<String>
using namespace std;int next_[10] = { 1 };void getNext(string T) {int size, i, j, m;size = T.length();for (i = 0; i < size; i++) { //遍历 T 前后缀的所有情况m = 0;for (j = 1; j <= i; j++) { // 找到 相同前后缀的个数if (T[m] == T[j]) {  //如果匹配到 目标串T 的第一个字符有重复,则判断随后的几个字符是否相同,即移动后继续判断m++; // 前缀移动一位j++; // 后缀移动一位while (T[m] == T[j] && j<=i) { //如果移动后仍然相同,则重复继续移动 直到 不相同 或 遍历T结束m++;j++;}if (j<=i)m = 0; //如果while中途结束(即匹配到不相同的字符,相同前后缀不成立) 则 前缀后缀相同数 m 清零// 如果while正常结束 则证明找到相同前后缀;}}next_[i+1] = i+1 - m; //最大移动位数 = 匹配到的字符个数(i+1) - 相同前后缀个数(与最后一个字符相同的字符的位置);}
}int kmp(string S,string T,int start=0) {getNext(T);int Ssize = S.length();int Tsize = T.length();int i, j, k, index;i = start;while (i <= Ssize-Tsize) { k = 0; //匹配到的个数index = i; // 当前与S匹配的位置for (j = 0; j < Tsize; j++) {if (T[j] == S[index]) {  //第一个字符匹配成功后,T 和 S 各向后移动一位k++;index++;}else{ // 出现不匹配情况,就对字符串 S 进行最大移动i += next_[k];  // 根据匹配到的数量 对S串进行移动break; //移动后跳出本次循环,然后继续进行下一次匹配}}if (j == Tsize)return i; // 如果T完全遍历,则匹配到字符串}// while结束都没返回,则证明找不到该字符串return -1;
}int main() {string S, T;int size, index;cin >> S >> T;index = kmp(S, T, 0);cout << index;return 0;
}

第一次写KMP的体会相关推荐

  1. 第一次写blog,哈哈

    第一次写blog,哈哈,还是有点感觉的,不过刚下好班,整个脑子乱的不行,可以说是一片糨糊,看看人家的blog很舒服,真的自己写了还真的不知道写些什么,看来这也是自己的总结,工作两年来,感觉肚子里还真的 ...

  2. 第一次写,python爬虫图片,操作excel。

    第一次写博客,其实老早就注册博客园了,有写博客的想法,就是没有行动,总是学了忘,忘了丢,最后啥都没有,电脑里零零散散,东找找,西看看,今天认识到写博客的重要性. 最近闲着看了潭州教育的在线直播课程,颇 ...

  3. 前端老弟第一次写后端,崩了!

    幽默轻松小知识,一起来看看老弟第一次写的后端代码,你觉得如何? 大家好,我是鱼皮,今天分享我的老弟第一次写后端代码时出现的囧事,希望大家引以为戒. 孽起 我的老弟小阿巴,目前大一,自学编程有一段时间了 ...

  4. 携程航班信息爬取(python)---第一次写博客,不好请别见外!

    1.航班信息接口 api="https://flights.ctrip.com/itinerary/api/12808/products",这个接口中包含了所要查询的航班信息. * ...

  5. 第一次写writeup

    My WriteUp 题目:http://ctf5.shiyanbar.com/DUTCTF/1.html (第一次写writeup...嗯都懂) 思路:点进去发现真的是what a fuck! 感觉 ...

  6. Latex第一次写论文记录

    Latex第一次写论文记录 1. Latex的安装 2. Latex的简单使用 4. Latex模板 5. 论文标题,作者 6. Abstract 7. Introduction 7.1 文献的引用 ...

  7. Python paromiko每日生活学习感悟(第一次写,紧张hahaha)

    Python paromiko每日生活学习感悟(第一次写,紧张hahaha) 学习篇 生活篇 学习篇 今天整天实习,解决了虚拟机通过SSH进行远程登录,需求还增加一项就是要采用多个接入多个设备,采用了 ...

  8. 创客学院 level1第一节学习完成(第一次写博客)

    第一次写博客 创客学院 level1第一节学习完成 断断续续花了大概两天,已经在同学(龙欢)的推荐下,学习了java最基本的语法,大概就是和C语言差不了多少,感觉还是好接受,在昨天晚上也是和同学讨论了 ...

  9. 第一次写学术论文无从下手咋办?

    又是一年准备复试的时候了,又有无数的科研学子叩开学术的大门,希望我的这篇文章对第一次写论文的研究生们有所帮助! 先跟大家分享一个学术网站:[学术范] 这里面有很多学术资源,英文文献特别多,对于英文写作 ...

最新文章

  1. 及cp含义_当我们谈论CP时,我们在谈论什么?
  2. 基于SSM实现在线聊天系统
  3. 结构化的网络故障检测与排除方法
  4. 一些学Web前端最常见的错误分享
  5. Linux系统编程9:进程入门之操作系统为什么这么重要以及它是如何实现管理的
  6. 链表和数组的区别在哪里?
  7. codeforces #309 div1 D
  8. 2017年9月计算机二级office题库百度云,2017年9月计算机二级office题库
  9. B/S系统界面设计与开发详解
  10. 计算机组成部件及其作用,计算机硬件组成成分各自的功能 计算机硬件有哪几部分组成?请分别说明各部分的作用?...
  11. 量化交易6-backtrader编写策略的时数据获取
  12. 五年之后的前端会是什么样?
  13. 新手入门PS人像磨皮教程
  14. 管壳式程序c语言,换热器模型原程序(C语言).doc
  15. 与、或、异或、按位取反
  16. 虚拟机内连接MotionPro一直处于正在连接状态
  17. Linux 面试知识点
  18. 控制互联网就是控制世界
  19. 【云原生】Prometheus PromQL讲解与实战操作
  20. 大家在人生低谷时有多惨,怎么熬过来的(二)

热门文章

  1. 重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
  2. 一个中心、三大原则,阿里这样做智能对话开发平台
  3. 波士顿动力机器人逆天,人类已无法阻挡它的三级跳!
  4. 如何从系统层面优化深度学习计算?
  5. 品友互动入榜“AI First——2017-2018年中国人工智能先行企业榜TOP10”
  6. AI一分钟 | 教育部公布高中新课标,编程、算法思维成必修内容;李彦宏否认百度会“All in AI”
  7. Spring中SmartLifecycle和Lifecycle的作用和区别
  8. 让SpringBoot不再需要Controller、Service、Mapper,这款开源工具绝了!!!
  9. 推荐一款 Java 对象映射神器
  10. 春节假期是弯道超车的好机会!