KMP算法学习

kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是遍历a的每一个位置,然后从该位置开始和b进行匹配,但是这种方法的复杂度是O(nm)。kmp算法通过一个O(m)的预处理,使匹配的复杂度降为O(n+m)。

参考链接:【经典算法】——KMP,深入讲解next数组的求解 - c_cloud - 博客园
讲解的非常清楚明白

主要就是next数组的求解

KMP算法的核心所在,就是next数组的求解!不过,在这里我找到了一个全新的理解方法!如果你懂的上面我写的的,那么下面的内容你只需稍微思考一下就行了!

跟刚才一样,我用一句话来阐述一下next数组的求解方法,其实也就是两个字:

继承

a、当前面字符的前一个字符的对称程度为0的时候,只要将当前字符与子串第一个字符进行比较。这个很好理解啊,前面都是0,说明都不对称了,如果多加了一个字符,要对称的话最多是当前的和第一个对称。比如agcta这个里面t的是0,那么后面的a的对称程度只需要看它是不是等于第一个字符a了。

b、按照这个推理,我们就可以总结一个规律,不仅前面是0呀,如果前面一个字符的next值是1,那么我们就把当前字符与子串第二个字符进行比较,因为前面的是1,说明前面的字符已经和第一个相等了,如果这个又与第二个相等了,说明对称程度就是2了。有两个字符对称了。比如上面agctag,倒数第二个a的next是1,说明它和第一个a对称了,接着我们就把最后一个g与第二个g比较,又相等,自然对称成都就累加了,就是2了。

c、按照上面的推理,如果一直相等,就一直累加,可以一直推啊,推到这里应该一点难度都没有吧,如果你觉得有难度说明我写的太失败了。

当然不可能会那么顺利让我们一直对称下去,如果遇到下一个不相等了,那么说明不能继承前面的对称性了,这种情况只能说明没有那么多对称了,但是不能说明一点对称性都没有,所以遇到这种情况就要重新来考虑,这个也是难点所在。

如果蓝色的部分相同,则当前next数组的值为上一个next的值加一,如果不相同,就是我们下面要说的!
如果不相同,用一句话来说,就是:

从前面来找子前后缀

1、如果要存在对称性,那么对称程度肯定比前面这个的对称程度小,所以要找个更小的对称,这个不用解释了吧,如果大那么就继承前面的对称性了。

2、要找更小的对称,必然在对称内部还存在子对称,而且这个必须紧接着在子对称之后。

如果看不懂,那么看一下图吧!

说了这么多,下面是代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 100void cal_next( char * str, int * next, int len )
{int i, j;next[0] = -1;for( i = 1; i < len; i++ ){j = next[ i - 1 ];while( str[ j + 1 ] != str[ i ] && ( j >= 0 ) ){j = next[ j ];}if( str[ i ] == str[ j + 1 ] ){next[ i ] = j + 1;}else{next[ i ] = -1;}}
}int KMP( char * str, int slen, char * ptr, int plen, int * next )
{int s_i = 0, p_i = 0;while( s_i < slen && p_i < plen ){if( str[ s_i ] == ptr[ p_i ] ){s_i++;p_i++;}else{if( p_i == 0 ){s_i++;}else{p_i = next[ p_i - 1 ] + 1;}}}return ( p_i == plen ) ? ( s_i - plen ) : -1;
}int main()
{char str[ N ] = {0};char ptr[ N ] = {0};int slen, plen;int next[ N ];while( scanf( "%s%s", str, ptr ) ){slen = strlen( str );plen = strlen( ptr );cal_next( ptr, next, plen );printf( "%d\n", KMP( str, slen, ptr, plen, next ) );}return 0;
}

参考链接
如果你看不懂KMP算法,那就看一看这篇文章( 绝对原创,绝对通俗易懂) - Stay Hungry,Stay Foolish - 博客频道 - CSDN.NET

字符串匹配算法总结 - WINCOL的专栏 - 博客频道 - CSDN.NET

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生命或可在星际间传播

来源&#xff1a;中国科学报去年&#xff0c;当一颗美式足球场大小的雪茄形天体Oumuamua进入太阳系时&#xff0c;它并非仅仅让人们第一次看到了一块星际岩石。根据一项新的研究&#xff0c;这也支持了太空岩石通过在遥远的恒星系统之间运送微生物&#xff0c;从而在星际间传播…

操作系统(二): 进程与线程

操作系统(二): 进程与线程 本章解读 进程管理是操作系统重点中的重点&#xff0c;涵盖了操作系统中大部分的知识和考点。其主要包括四部分&#xff1a;进程与线程&#xff0c;处理器调度&#xff0c;同步与互斥&#xff0c;死锁。所以我准备分四个部分来解释这四个模块。进程与…

Nature最新研究:超9000学者每5天发1篇论文,这些高产作家背后的科研圈

来源&#xff1a;悟空智能科技发论文发论文发论文……你有没有想过&#xff0c;假如你能够一周发一篇论文&#xff0c;这样坚持10年甚至20年&#xff0c;你能成为全球最高产的学者吗&#xff1f;答案可能吓你一跳&#xff1a;不能。不但不能&#xff0c;你甚至连全球前10000名都…

Android之WebView学习

WebView常用方法 WebSettings 在使用WebView前我们都要进行相关的配置&#xff0c;常见的操作如下&#xff1a; WebSettings settings mWebView.getSettings();settings.setJavaScriptEnabled(true); //支持javascriptsettings.setUseWideViewPort(true); //设置webv…

跌宕中,特斯拉拿下上海工厂,给蔚来们留下不到两年窗口期

来源&#xff1a;网易智能昨日&#xff0c;特斯拉上海工厂尘埃落定。特斯拉与上海规划与国土资源管理局签订协议&#xff0c;以9.73亿人民币拿下上海临港约1297.32亩地建造汽车工厂。据悉&#xff0c;这是特斯拉在美国之外设立的首个超级工厂。根据特斯拉的规划&#xff0c;上海…

2019科学突破奖揭晓 庄小威陈志坚许晨阳上榜

来源&#xff1a;科学网10月17日&#xff0c;科学突破奖&#xff08;Breakthrough Prize&#xff09;名单揭晓。总计2200万美元的奖金分别给了婴儿死亡主要遗传因素治疗、超分辨率成像、发现一种新型电子材料以及其他重大突破。华裔科学家庄小威、陈志坚、C. Frank Bennett 、A…

Android之IPC机制

Android IPC简介 任何一个操作系统都需要有相应的IPC机制&#xff0c;Linux上可以通过命名通道、共享内存、信号量等来进行进程间通信。Android系统不仅可以使用了Binder机制来实现IPC&#xff0c;还可以使用Socket实现任意两个终端之间的通信。 IPC基础概念介绍 (1)Seriali…

HTML5与原生APP之争胜负已出?

早在HTML5技术问世之时&#xff0c;有关网络应用与原生应用谁将成为移动终端霸主的问题&#xff0c;就曾引起过广泛的争论。时至今日&#xff0c;不仅关于二者孰强孰弱的争论已然平息&#xff0c;就连备受关注的移动互联网创业公司也大多是做原生APP的&#xff0c;未曾见过HTML…

5G 产业链:基站天线和小基站爆发潜力大

来源&#xff1a;国信证券5G宏基站数的翻倍增长及技术演进带来基站天线成倍增长空间。5G关键性能指标十倍的增长需要基站数翻倍增长以支撑。5G的三个关键的效率需求包括频谱利用效率、能耗效率和成本效率。具体来说&#xff0c;5G在频谱效率、能源效率和成本效率的提升需求在十…

操作系统之死锁

死锁的概念以及产生死锁的原因 一组进程中&#xff0c;每个进程都无限等待被该组进程中另一进程所占有的资源&#xff0c;因而永远无法得到的资源&#xff0c;这种现象称为进程死锁&#xff0c;这一组进程就称为死锁进程,如果死锁发生&#xff0c;会浪费大量系统资源&#xff…

2018全球最佳品牌Top25:时代巨变的一个缩影

来源&#xff1a;资本实验室10月15日&#xff0c;希尔斯控股正式向美国破产法院申请破产保护。这一消息传出&#xff0c;即引发了全球关注。作为19世纪八十年代末以邮购业务起家的零售商&#xff0c;希尔斯百货已经历一百多年的世事变化与市场风云&#xff0c;毫无疑问是美国零…

香港2013迷你制汇节即将启幕

“制汇节是一个世界的盛事。在亚洲&#xff0c;有深圳迷你制汇节和台湾迷你制汇节。在美国&#xff0c;2013年港湾地区制汇节刚刚在5月圆满举办。来自世界各地的maker展示了他们伟大的作品并分享了他们的智慧。我们相信香港也有很多maker&#xff0c;第二届香港迷你制汇节正在开…

重磅!Gartner公布2019年十大战略科技发展趋势

来源&#xff1a;网络大数据摘要&#xff1a;10月14日至18日&#xff0c;分析师在Gartner Symposium/ITxpo 2018大会探讨了在2019年企业与组织需要探索的十大战略技术趋势(Gartner Top 10 Strategic Technology Trends 2019)。Gartner将战略性技术趋势定义为具有巨大破坏性潜力…

sixxpack破解的文章!【转】

星期天闲着没事玩游戏&#xff0c;玩游戏不能无外挂。于是百度了半天&#xff0c;找到了一个&#xff0c;看介绍貌似不错&#xff0c;就下载了下来。一看&#xff0c;竟然是用.net写的&#xff0c;下意识地Reflector了一下。发现竟是一个叫actmp的程序集。如图&#xff1a; 随…

postgres与osm初步使用

layout: post title: postgres与osm初步使用 date: 2016-9-20 categories: blog tags: [地图开发] description:地图开发 本文主要包括以下内容 postgreSQL数据库&#xff0c;用来存放地图原始数据osm2pgsql 用来将osm地图数据导入到postgreSQL  OSM数据 OpenStre…

XxIJob入门-示例

一、部署 xxlJob (一) 下载地址&#xff0c; git clone 到本地。 http://gitee.com/xuxueli0323/xxl-job https://github.com/xuxueli/xxl-job (二) 插入 xxl_job 的sql脚本&#xff1a; 在项目的 /xxl-job/doc/db/tables_xxl_job.sql &#xff0c;找到sql脚本&#xff0c…

华为数字化转型实践

来源&#xff1a;先进制造业数字化转型势在必行&#xff0c;这已成为所有企业CIO的共识。但在现实中&#xff0c;很多数字化转型计划还是陷入重重困难&#xff0c;其原因大多在于企业内部对数字化转型的认知还不够透彻。尤其是对于那些业务正处于发展和上升期的公司&#xff0c…

使用Excel VBA(快捷键)(加菜单)

将excel宏安全性调到中&#xff1a; 按altf11进入vba编辑器&#xff1a; 记住以下快捷键&#xff1a; F7 代码窗口 F4 属性窗口 ctrlR 工程资源窗口 F5 程序运行 TAb 代码缩进 SHIFTTAB 凸出 加菜单&#xff1a; 在excel表中按altf11进入代码窗口&#xff1a; 解释&#xff1a…

赛迪研究院发布《2018年中国自动驾驶产业发展及投资价值白皮书》!

来源&#xff1a;中国电子信息产业发展研究院10月19日&#xff0c;由北京市人民政府、工业和信息化部主办&#xff0c;工业和信息化部装备工业发展中心、中国电子信息产业发展研究院&#xff08;以下简称“赛迪研究院”&#xff09;等机构共同承办的“世界智能网联汽车大会”进…

瓦片地图与geoserver发布

本文主要包括以下内容 TileMill生成Tile影像金字塔&#xff08;.mbtiles压缩文件&#xff09;Mbutil(https://github.com/mapbox/mbutil)解压缩Apache HTTP Server(或tomcat) 建立web瓦片服务客户端调用&#xff08; http://www.arcgis.com/home&#xff09;测试 首先将数据…