字符串--------KMP算法(studying)

初识kmp算法(呕心沥血之文----看视频+总结)

版权声明:转载请注明出处哦~ https://blog.csdn.net/Cassie_zkq/article/details/81564613

大一菜鸟,即将大二,依旧菜鸟一只QAQ

最近在中国大学慕课上看数据结构的课程,我看的是西安邮电大学的数据结构与算法课,kmp算法出现在“串”那一章节

具体内容我就不细讲了,大家可以去看一下。老师讲得还是很明白的。

  • next数组的实现

注意:网上的课程中默认字符串的下标从1开始

实现思路:

比如j=4时next[4]=2,即下次比较时从第二个字符开始比较(下标从1开始),第一个0指下次比较时从第一个字符开始

代码实现:(注意下标从1开始)


   
   
   
   
  1. int main() {
  2. char s1[maxn],s2[maxn]; //s1是文本串,s2是模式串
  3. int next[maxn];
  4. scanf( "%s",s2+ 1); //从1开始读或者写成cin>>s2+1;
  5. int i,j= 1,k= 0,len= strlen(s2+ 1);
  6. next[ 1]= 0;
  7. while(j
  8. {
  9. if(k== 0||s2[j]==s2[k])
  10. {
  11. j++;
  12. k++;
  13. next[j]=k;
  14. }
  15. else k=next[k];
  16. }
  17. for(i= 1;i<=len;i++)
  18. cout<" ";
  19. return 0;
  20. }

以ababcabaababb为例,输出如下:

  • kmp算法的实现:

思路:

实现代码:


   
   
   
   
  1. int main() {
  2. char s1[maxn],s2[maxn]; //s1是文本串,s2是模式串
  3. int next[maxn];
  4. scanf( "%s%s",s1+ 1,s2+ 1);
  5. int i= 1,j= 1,len1= strlen(s1+ 1),len2= strlen(s2+ 1); //i指向文本串,j指向模式串,从文本串
  6. //的第i位开始查找
  7. while(i<=len1&&j<=len2)
  8. {
  9. if(j== 0||s1[i]==s2[j])
  10. {
  11. i++;
  12. j++;
  13. }
  14. else j=next[j];
  15. }
  16. if(j>len2) cout<endl; //返回完全匹配的初始位置
  17. else cout<< "-1"<< endl;
  18. return 0;
  19. }
  • 实现kmp算法的完整代码:


   
   
   
   
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #define maxn 1000000
  7. using namespace std;
  8. int main() {
  9. char s1[maxn],s2[maxn]; //s1是文本串,s2是模式串
  10. int next[maxn];
  11. scanf( "%s%s",s1+ 1,s2+ 1);
  12. int i= 1,j= 1,k= 0,len1= strlen(s1+ 1),len2= strlen(s2+ 1); //i指向文本串,j指向模式串
  13. next[ 1]= 0;
  14. while(j//因为内层油j++,所以j最大为len2-1,等于len2时就退出
  15. {
  16. if(k== 0||s2[j]==s2[k])
  17. {
  18. j++;
  19. k++;
  20. next[j]=k;
  21. }
  22. else k=next[k];
  23. }
  24. i= 1,j= 1; //i文本串 j模式串
  25. while(i<=len1&&j<=len2)
  26. {
  27. if(j== 0||s1[i]==s2[j])
  28. {
  29. i++;
  30. j++;
  31. }
  32. else j=next[j];
  33. }
  34. if(j>len2) cout<endl; //返回完全匹配的初始位置
  35. else cout<< "-1"<< endl;
  36. return 0;
  37. }

输出结果:


   
   
   
   
  1. ababcabaababb
  2. abaa
  3. 0 1 1 2
  4. 6

但是,思考在计算next数组时,如果s2=aaaaab,s2对应的next数组为0 1 2 3 4 5

如果在比较第4位时不同需要进行如图操作:

实际上我们知道,模式串第四位之前的字母也都是a,所以在按之前的操作执行的话肯定都是不等的,最后还是重新要从模式串的第一位比较,同时指向文本串的i右移一位,所以这个时候直接执行“从模式串的第一位比较,同时指向文本串的i右移一位”这个操作即可,如下图:

黑色框内的步骤无需执行,直接执行橙色圈内的操作即可,所以需要对之前的next数组,进行优化,我们称它为nextval数组,用nextval数组来代替next数组

  • nextval数组的实现

实现代码:


   
   
   
   
  1. #include
  2. #include
  3. using namespace std;
  4. #define maxn 100000//如果数组定义在main内,不能开太大
  5. int main()
  6. {
  7. char s1[maxn],s2[maxn]; //s1文本串,s2模式串
  8. scanf( "%s",s2+ 1);
  9. int i,j,k,len1= strlen(s1+ 1),len2= strlen(s2+ 1);
  10. int next[maxn],nextval[maxn];
  11. next[ 1]= 0;
  12. j= 1,k= 0;
  13. while(j
  14. {
  15. if(k== 0||s2[j]==s2[k])
  16. {
  17. k++;
  18. j++;
  19. next[j]=k;
  20. }
  21. else k=next[k];
  22. }
  23. for(i= 1;i<=len2;i++)
  24. cout<" ";
  25. cout<< endl;
  26. j= 2;k= 0;
  27. while(j<=len2)
  28. {
  29. k=next[j];
  30. if(s2[j]==s2[k])
  31. nextval[j]=nextval[k];
  32. else nextval[j]=next[j];
  33. j++;
  34. }
  35. for(i= 1;i<=len2;i++)
  36. cout<" ";
  37. cout<< endl;
  38. return 0;
  39. }

   
   
   
   
  1. aaaaab
  2. 0 1 2 3 4 5
  3. 0 0 0 0 0 5
  • 优化后的kmp算法的完整代码为:(终极版)


   
   
   
   
  1. #include
  2. #include
  3. using namespace std;
  4. #define maxn 100000//如果数组定义在main内,不能开太大
  5. int main()
  6. {
  7. char s1[maxn],s2[maxn]; //s1文本串,s2模式串
  8. scanf( "%s%s",s1+ 1,s2+ 1);
  9. int i,j,k,len1= strlen(s1+ 1),len2= strlen(s2+ 1);
  10. int next[maxn],nextval[maxn];
  11. next[ 1]= 0;
  12. j= 1,k= 0;
  13. while(j
  14. {
  15. if(k== 0||s2[j]==s2[k])
  16. {
  17. k++;
  18. j++;
  19. next[j]=k;
  20. }
  21. else k=next[k];
  22. }
  23. j= 2;k= 0;
  24. while(j<=len2)
  25. {
  26. k=next[j];
  27. if(s2[j]==s2[k])
  28. nextval[j]=nextval[k];
  29. else nextval[j]=next[j];
  30. j++;
  31. }
  32. i= 1;j= 1; //i指文本串,j指模式串
  33. while(i<=len1&&j<=len2)
  34. {
  35. if(j== 0||s1[i]==s2[j])
  36. {
  37. i++;
  38. j++;
  39. }
  40. else j=nextval[j];
  41. }
  42. if(j>len2) cout<endl;
  43. else cout<< "-1"<< endl;
  44. return 0;
  45. }

输出样例:


   
   
   
   
  1. ababcabaababb
  2. abaa
  3. 6

   
   
   
   
  1. aaaaab
  2. ab
  3. 5

最后一个代码才是完整的kmp代码,至此,查找(匹配)子串,并返回相匹配时第一个字母出现的位置的知识点就都总结完了

还是不懂的盆友可以看我在博客开头推荐的视频或者和百度哦~我也只是微微懂一些罢了哈哈哈

欢迎交流讨论,非诚勿扰哦~邮箱:[email protected]

				
				

字符串模式匹配----KMP算法(视频讲解)

07-07 1003

2.4.2、KMP算法 资讯网址:www.qghkt.com腾讯课堂:https://qghkt.ke.qq.com/20个常用算法【基本思想】       在布鲁特-福斯算法的基础上,进行如下改进:... 来自: hnyjwang的博客

		

上:http://v.youku.com/v_show/id_XODYxNjExODQ…

来自: A_Prophet的博客



		

下:http://www.56.com/u28/v_NjAwMzA0O…

来自: hnust_xiehonghao的专栏



		


    
		

编 辑:李文臣

1
字符串匹配是经典的KMP算法。下面以字符串"BBC ABCDAB ABCDABCDABDE"为例,查找是否包含串"ABCDABD"?

图一


来自: 燕哥带你学算法



		


    
		

视频地址:http://v.you…

来自: 写代码,是犯罪. 找bug,是破案- -…



		

此文转自神的博客  http://blog.csdn.net/v_july_v/article/details/7041827#

作者:July
时间:最初写于2011年12…

来自: 楠先生



KMP算法主要解决字符串匹配问题,其中失配数组next很关键;

看毛片算法真是人如其名,哦不,法如其名。

看了这篇博客,转载过来看一波;

B站这个三哥的视频讲的蛮详细

void g…

来自: CSer 高金满的博客



		
    
		


          
流浪的狗和一坨屎关注
流浪的狗和一坨屎

555篇文章

排名:8000+

TheOneGIS关注
TheOneGIS

441篇文章

排名:1000+

坦GA关注
坦GA

2574篇文章

排名:170

dyx心心关注
dyx心心

102篇文章

排名:千里之外

字符串单模式问题描述:

给定文本串text,和模式串pattern,在文本串text中找到模式串pattern第一次出…

来自: 黑脉金的博客



一、关于工作与生活 
   
   我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上…

来自: 坦GA的博客



		

拓展kmp算法是对KMP算法的扩展,它解决如下问题:
定义母串S,和字串T,设S的长度为n,T的长度为m,求T与S的每一个后缀的最长公共前…

来自: ddyyxx的程序员之路



		

Java是于 1995年 由Sun公司推出的
极富创造力的 面向对象程序设计语言
它由Java之父——Sun研究院院士
詹姆斯·高斯林(James Gosling)博士…

来自: ScottZhan的专栏



		

参考:http://blog.csdn.net/v_july_v/article/details/7041827
做了好几天KMP的题,今天终于写好了,可以总结一下这么多天学到的东西了…

来自: christ1750的博客



jQuery由美国人John Resig于2006年创建;jQuery是目前最流行的JavaScript程序库,它是对JavaScript对象和函数的封装;它的设计思想是writ…

来自: 妖精小狗的博客



		


    
		

CSS——层叠(级联)样式表(Cascading Style Sheet):表现HTML或XHTML文件样式的计算机语言【包括对字体、颜色、边距、高度、宽度、背景图片、网页定位等设定…

来自: 妖精小狗的博客



		

每当涉及该算法都甚新鲜,极想把玩一番,经过一番琢磨,终于悟透其本质。遂将其束之高阁,数月之后,再相邂逅,新鲜如初,又是一番把玩、醒悟、遗忘…

来自: 术学家笔记



		

    BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的…

来自: hpugym的专栏



别再拿死工资了,2018聪明的泰安人都在靠它赚外快 悦宜 · 燨燚
		


    
		

Web标准不是某一个标准,而是由W3C和其他标准化组织制定的一系列标准的集合。
主要包括结构(Structure)、表现(Presentation)和行为(Behavior)三个…

来自: helloWorldAndYou的博客



		

KMP算法可以说说许多学习算法的同学的第一道坎,要么是领会不到KMP算法的思想,要么是知道思想写不出代码,网上各种查找。关于算法的书籍上也都有KMP算法的实现,可为啥自己写不出来呢?博主看得大…

来自: 无欲则刚



		

时间 2014-03-09 20:32:21  CSDN博客
原文  http://blog.csdn.net/u011564…

来自: 72 73 76 89 82 84 89 81



		

别再拿死工资了,2018聪明的泰安人都在靠它赚外快 涌德投资 · 燨燚
		

http://weidu.baidu.com/view/380a5c728e9951e79b892778.html

一种CAN报文优先级…

来自: chungle2011的专栏



			

自己的资源,不是很好,自己看视频总结


		


    
		


    
		

 
 
全称:                               Knuth_Morris_Pratt Algorithm(KMP算法)
类型:        …

来自: 全栈家园



股市奇才17年不亏之谜,方法令人意想不到.... 东正金融 · 燨燚
		

看了一天多的KMP终于有点眉目了,自己在本子总结的,希望以后自己翻起来的时候还能回忆起来。

下面是next的函数推导:

基本就是这些了

另外还有一些Java语言写的KMP程…

来自: qq_24343273的博客



		


    
		

选择符{
  属性名:属性值;
  属性名:属性值;
  ……
 }
css颜色
1.颜色的英文单词
2.十六进制 #00 ff 00 红,绿,蓝 两两是一位,…

来自: 孔孟老儿



		

作者:Lwen
时间:2017年10月28 日
引言:
最近在上《数据结构》这本书,听到kmp算法一头雾水。经过几天的理解,此时依然只是能够知道kmp算法的思想,还没有自行写代码实现…

来自: lwen_59的博客



		

		

关于KMP算法,大家可以查阅博客园的这篇文章:
阮一峰:字符串匹配的KMP算法

这篇解释文章相当简明,当然july的这篇文章也可以读一读:
六之续、由KMP算法谈到BM算…

来自: 一名普通码农的菜地



		


    
			


    
		

本篇文章主要针对常见的KMP问题进行…

来自: zhenlingcn的博客



		

		


    
		


    
		

iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access …

来自: 逗号的博客



		

讲这个算法之前,我们首先了解几个概念:

串:又称字符串,是由零个或多个字符组成的有限序列。如S=”abcdef”

子串:串中任意个连续的字符组成的子序列,称为该串的子…

来自: qq_41789959的博客



		

    首先说下我的配置:台…

来自: little豪斯



		

下面附上一个next计算的算法不错的博客,我就是…

来自: kejizuiqianfang的博客



		

1) Mybatis是一种半自动化的ORM实现
ORM:对象关系映射- - 通过使用描述对象和数据库之间映射的元数据,将程序中的对象 自动持久化到关系数据库中
2) mybat…

来自: 黑暗之神的博客



		


    
		

转载请标明出处: http://blog.csdn.net/forezp/article/details/70148833
本文出自方志朋的博客

错过了这一篇,你可能再也学不会 Sp…

来自: 方志朋的专栏



		

方法一:(更新时间:2018/4/8)v3.3

注册时,在打开的Lice…

来自: 唐大帅的编程之路



		

先准备好apk,放到桌面 
看看app有没有加固,如果加固了,逆向起来…

来自: 无聊看风景的博客



		

1、简介
Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发。
Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没…

来自: zping0808的博客



		

安装完成,打开Webstorm,在弹出的License Activation窗口中选择“License server”,在输入框输入下面的网址: 

htt…

来自: 老妖儿的博客



		

转眼间,2018 年已进入倒计时阶段,回忆起这一年中编程语言界的发展,过得风生水起的语言非 Python 莫属。而它的火热和人工智能产业的爆发不无关系,但全局来看,得益于 AI 的 Python 并…

来自: CSDN资讯



		


    
		


    
		

因公司的需求,需要做一个爬取最近上映的电影、列车号、航班号、机场、车站等信息,所以需要我做一个爬虫…

来自: 昌昌



		

上一节课我们学习了  颜色与纹理中–彩色三角形

这一节课我们将学习  颜色与纹理中-在图像上贴图片

实…

来自: 谷子的博客



		

现在越来越流行在线看视频了,但是对于我得收藏癖爱好者,还是希望可以有比较好的资源网站的,尤其是种子、磁力链网站。所以就整理了一份干净、好用的TOP10出来:

先推荐一个下载磁力链的工具:

马…

来自: YXAPP的技术分享



		

第1章 Python对象初探
1.1 Python内的对象
1.1.1 对象机制的基石——PyObject
1.1.2 定长对象和变长对象
1.2 类型对象
1.2.1…

来自: john_dung的博客



		

所有的课程源代码在我上传的资源里面,本来想设置开源,好像不行!博客和专栏同步!

如有错别字或有理解不到位的地方…

来自: 谷子的博客



		

【权威】官网最新版本破解永久有效

本人实锤亲测可用,喜欢的话可以关注下哟,后面会持续更新
10-18 :破解永久有效,


来自: 赏樱看雪撸代码



		

如在文档中遇到什么问题请联系作者
——————————————————————————————————————
服务消费者

获…



		

本人正在找深圳Java实习工作,求大佬带飞
——————————————————————————————————————
消费者从Eure…



		


    
		

 

 

表格布局和绝对布局不常用,了解就好

 

谷歌替代system.out.println()用Log.v(d&lt;i&…

来自: 唐三十胖子的博客



		

百度网盘不限速 点击下载 提取码:jsk0
对于大多数人来说,每次在百度网盘下载东西的时候总会被限速,如果不想被限速就要充值百度网盘的SVIP,…

来自: qq_41925894的博客



		

最新版的Proxyee-down为3.12(2018.10更新),因为作者在3.x后的版本中并未发布exe版…

来自: shadandeajian的博客



		


    
		

上一节课我们学习了  颜色与纹理中–在图像上贴图片

这一节课我们将学习  三维空间-不同位置的三角形

在学…

来自: 谷子的博客



		

上一节课我们学习了  三维空间-不同位置的三角形

这一节课我们将学习  三维空间之加入旋转矩阵的三角形

本案…

来自: 谷子的博客



		

本人正在找深圳Java实习工作,求大佬带飞
——————————————————————————————————————
八在审核中,请见…



		

1
【单选题】我国陆地领土面积排名世界第几?(C)
A、1
B、2
C、3
D、4
2
【单选题】以下哪个国家不属于金砖五国(BRICS)?(B)
A、中国
B、日本
C…

来自: ling_wang的博客



		

一、元组
1.1、二元元组
data class Pair&amp;lt;out A, out B&amp;gt;(
public val first:…

来自: zping0808的博客



		


    
		

FFMPEG堪称自由软件中最完备的一套多媒体支持库,它几乎实现了所有当下常见的数据封装格式、多媒体传输协议以及音视频编解码器,提供了录制、转换以及流化音视频的完整解决方案。市面上使…

来自: qq_26464039的博客



		

下载OTP工具
首先到Office Too…

来自: 过了即是客



		

ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
2 ByteBuffe…

来自: weixin_43694144的博客



		

图片来源:中国新闻网
打扫卫生:

roomba 图片来源:wirecutter.com
图书管理:

图片来源:中国宁波网
看到这里你可能会产生这样的疑…

来自: GitChat



		

package com.car.client;
import java.io.IOException;
import java.io.OutputStream;
import java.ne…

来自: weixin_43694144的博客



		

所有的课程源代码在我上传的资源里面,本来想设置开源,好像不行!博客和专栏同步!

如有错别字或有理解不到位的地方…

来自: 谷子的博客



		

上一节课我们学习了   颜色与纹理中-将非坐标数据传入顶点着色器的另外一种方式–交错组织

这一节课…

来自: 谷子的博客



		

1.屌丝搜-最懂屌丝的搜索引擎(www.diaosisou.com)
号称最懂屌丝的BT搜索引擎,确实名副其实,屌丝…

来自: lizhengnanhua的专栏



		

csdn的兄弟们看…

来自: qq_36556893的博客



		

这学期状态一直不太好,数组和图都没有好好搞,这个寒假会完善一下的。

由于时间和水平有限,…

来自: hebtu666



		

你可能感兴趣的:(字符串--------KMP算法(studying))