第一轮复习完毕,kmp走起

//代码via:http://blog.csdn.net/v_JULY_v/article/details/6111565

//简单思路via:http://study.163.com/course/courseLearn.htm?courseId=468002#/learn/video?lessonId=1024414&courseId=468002

 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 using namespace std;
 5 
 6 int kmp_find(const string& target, const string& pattern)
 7 {
 8     const int target_length = target.size();
 9     const int pattern_length = pattern.size();
10     int * overlay_value = new int[pattern_length];
11     overlay_value[0] = -1;
12     int index = 0;
13     for (int i = 1; i<pattern_length; ++i)
14     {
15         index = overlay_value[i - 1];
16         while (index >= 0 && pattern[index + 1] != pattern[i])
17         {
18             index = overlay_value[index];
19         }
20         if (pattern[index + 1] == pattern[i])
21         {
22             overlay_value[i] = index + 1;
23         }
24         else
25         {
26             overlay_value[i] = -1;
27         }
28     }
29     //match algorithm start
30     int pattern_index = 0;
31     int target_index = 0;
32     while (pattern_index<pattern_length&&target_index<target_length)
33     {
34         if (target[target_index] == pattern[pattern_index])
35         {
36             ++target_index;
37             ++pattern_index;
38         }
39         else if (pattern_index == 0)
40         {
41             ++target_index;
42         }
43         else
44         {
45             pattern_index = overlay_value[pattern_index - 1] + 1;
46         }
47     }
48     if (pattern_index == pattern_length)
49     {
50         return target_index - pattern_index;
51     }
52     else
53     {
54         return -1;
55     }
56     delete[] overlay_value;
57 }
58 
59 int main()
60 {
61     string source = "ann6bcdanacadsannannabnna";
62     string pattern = "n6bcdan";
63     cout << kmp_find(source, pattern) << endl;
64     return 0;
65 }

相比BF算法(暴力匹配)KMP算法的时间复杂度有所提升,尤其是处理无重复匹配串。

但是我们除了目标串与匹配串还需引入一个数组int next[];存放每次失配位置对应的匹配串右移位数,下标从1开始。next[0]规定为-1(任一负整数

如何获得next[]数组是一个关键。

代码之前先谈谈思路

1)next[]只与匹配串有关

2)如果匹配串没有重复,那么一切好说,next[]按脚标顺序即可

3)匹配串有重复的情况,这就是我们要讨论的重点了,下一次从匹配串的哪一位开始与适配位置所在的目标串元素进行比较?

    这个位置就是我们next[i]所对应的值

     

next[i] 匹配子串长-(失配位置前重复数+1)

转载于:https://www.cnblogs.com/yuelien/p/5625287.html

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

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

相关文章

微信.NET SDK-Senparc资料整理

微信生态系统包括微信公众号、小程序、微信支付、微信开放平台、企业微信、小游戏等&#xff0c;官方提供了很多的API接口。Senparc是目前使用最广泛的微信.NET SDK&#xff0c;同时支持支持.NET Framework 4.5/.NET Core 2.x/.NET Core 3.x/.NET 5/.NET 6。由于在微信生态开发…

7 种提升 Spring Boot 吞吐量神技

目录 二、增加内嵌Tomcat的最大连接数 三、使用ComponentScan()定位扫包比SpringBootApplication扫包更快 四、默认tomcat容器改为Undertow&#xff08;Jboss下的服务器&#xff0c;Tomcat吞吐量5000&#xff0c;Undertow吞吐量8000&#xff09; 五、使用 BufferedWriter 进…

Atitit.ati orm的设计and架构总结 适用于java c# php版

Atitit.ati orm的设计and架构总结 适用于java c# php版 1. Orm的目标 1 1.1. 动态obj 1 1.2. Hb的api(meger,save,update,del) 1 2. Orm的概念 1 3. 动态obj 2 4. 參考 4 1. Orm的目标 1.1. 动态obj 1.2. Hb的api(meger,save,update,del) 2. Orm的概念 saveOrUpdate后的对象会纳…

【ArcGIS微课1000例】0043:ArcGIS缩略图的创建及应用

缩略图通常出现在地图文档中&#xff0c;便于在启动页面中快速打开指定的地图文档&#xff0c;提高效率。 文章目录一、缩略图预览二、缩略图创建一、缩略图预览 打开ArcMap软件&#xff0c;弹出启动窗口&#xff0c;在最近打开的文档中&#xff0c;可以看到两类&#xff0c;一…

JSP简单登录系统

Login登陆界面 <body> 登陆 <% session.invalidate();%> <form action"TestPW.jsp" method"post">用户名<input type"text" name"username"> 密码<input type"password" name"password&quo…

手动从0搭建ABP框架-ABP官方完整解决方案和手动搭建简化解决方案实践

本文主要讲解了如何把ABP官方的在线生成解决方案运行起来&#xff0c;并说明了解决方案中项目间的依赖关系。然后手动实践了如何从0搭建了一个简化的解决方案。ABP官方的在线生成解决方案源码下载参考[3]&#xff0c;手动搭建的简化的解决方案源码下载参考[4]。一.ABP官方在线生…

Java捕获并处理线程失败抛出的异常

使用 UncaughtExceptionHandler 示例代码如下&#xff1a; Thread.UncaughtExceptionHandler handler new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread th, Throwable ex) {System.out.println("Uncaught exception: " ex);} }; Th…

【ArcGIS微课1000例】0044:ArcGIS使用山体阴影显示DEM的3种方法

本文讲解了ArcGIS使用山体阴影显示DEM的3种方法:“影像分析”窗口、使用山体阴影效果和山体阴影效果工具的不同之处。 文章目录 一、“影像分析”窗口二、使用山体阴影效果三、山体阴影工具一、“影像分析”窗口 使用山体阴影显示 DEM 的方法有两种。最简单并且最具交互效果的…

区块链每日投资指南(0129)-证监会副主席表示数字货币需要监管

上一周的走势依然是工作日下跌&#xff0c;周末拉升的结局。这主要原因依然是&#xff0c;周末不上班。最终政策出炉之前&#xff0c;市场恐怕还将继续震荡。下周的工作日恐怕会重演下跌的节奏。但是经过了17号&#xff0c;23号&#xff0c;26号三次筑底来看&#xff0c;如果政…

蓝绿发布、滚动发布、灰度发布,有什么区别?

在项目迭代的过程中&#xff0c;不可避免需要”上线“。上线对应着部署&#xff0c;或者重新部署&#xff1b;部署对应着修改&#xff1b;修改则意味着风险。目前有很多部署发布的技术, 这儿将常见的做一个总结。 上面所说难免有些抽象, 举一个情景例子, 加入你是微博项目负责…

iOS 音频开发

音频基础知识 组成 音频文件的组成&#xff1a;文件格式(或者音频容器) 数据格式(或者音频编码)。 文件格式(或音频容器)是用于形容文件本身的格式。 我们可以通过多种不同的方法为真正的音频数据编码。例如CAF文件便是一种文件格式&#xff0c;它能够包含MP3格式&#xff0c;…

【ArcGIS微课1000例】0045:ArcGIS制图模板的自定义与使用方法

怎样在ArcGIS中保存地图模板以在地图制图与打印之前使用呢? 文章目录 一、地图模板简介二、地图模板创建1. 创建模板2. 创建缩略图3. 保存模板三、地图模板使用一、地图模板简介 使用ArcMap打开一个已有的地图模板,【文件】→【新建】,任选一个模板,这里选择一个传统模板。…

api 接口开发理论 在php中调用接口以及编写接口

如&#xff1a;http://localhost/openUser.php?actget_user_list&typejson 在这里openUser.php相当于一个接口&#xff0c;其中get_user_list 是一个API&#xff08;获取用户列表&#xff09;&#xff0c;讲求返回的数据类型为JSON格式。 你只需要在你PHP代码中执行这条链…

怎么样的框架对于开发者是友好的?

云原生离.NET开发到底有多远&#xff1f;云原生的概念由来不久&#xff0c;故事从“上云”开始&#xff0c;伴随dorker、k8s等技术的推出&#xff0c;以及CNCF与各大云厂商的共同加持&#xff0c;云原生逐渐被大家所熟知。云原生不依赖具体的云&#xff0c;不管公有云还是私有云…

JS 烧脑面试题大赏

本文精选了20多道具有一定迷惑性的js题&#xff0c;主要考察的是类型判断、作用域、this指向、原型、事件循环等知识点&#xff0c;每道题都配有详细傻瓜式的解析&#xff0c;偏向于初学者&#xff0c;大佬请随意。 第1题 let a 1 function b(a) {a 2console.log(a) } b(a)…

苹果ios用js的Date()出现NaN问题解决办法

原文:苹果ios用js的Date&#xff08;&#xff09;出现NaN问题解决办法ios使用如下方法获得NaN&#xff0c;安卓手机则是正常计算&#xff0c;解决方法是换个这个时间的格式 new Date("2017-04-28 23:59:59").getTime() 换成如下方式就正常了&#xff0c;就是‘-’换成…

Thinkphp 验证码、文件上传

一、验证码 验证码参数 例题&#xff1a;登录时验证下验证码 LoginController.class.php <?php namespace Home\Controller; use Think\Controller; class LoginController extends Controller {public function Login(){if(empty($_POST)){$this->display(); } e…

ArcGIS实验教程——实验四十七:数据驱动页工具批量制作甘肃省各地级市人口七普专题图集

本实验详细讲解利用ArcGIS数据驱动页工具,制作甘肃省各地级市人口七普专题图集。 文章目录 1. 数据驱动页工具简介2. 甘肃省各地级市人口七普专题图集2.1 符号化及标注2.2 数据驱动页的创建2.3 数据驱动页面文本操作2.4 数据驱动页的导出1. 数据驱动页工具简介 数据驱动页面是…

为什么Java有GC调优而没听说过有CLR的GC调优?

前言在很多的场合我都遇到过一些群友提这样的一些问题&#xff1a;为什么Java有GC调优而CLR没有听说过有GC调优呢&#xff1f;到底是Java的JVM GC比较强还是C#使用的.NET CLR的GC比较强呢&#xff1f;其实业内已经有几位大佬的高赞文章和大家分享一下&#xff0c;主要讨论JVM和…

Ubuntu16.04 - 安装RabbitVCS,linux下的TortoiseSVN!!!

RabbitVCS 官网&#xff1a;http://rabbitvcs.org/ 1&#xff0c;添加PPA源。在shell里面执行下面命令&#xff1a; sudo add-apt-repository ppa:rabbitvcs/ppa 这个命令执行完毕后&#xff0c;查看执行结果看是否密钥导入成功&#xff0c;成功截图&#xff1a; 如果导入密钥失…