KMP算法开荒
文章目录
- 一 、前言
- 二、 暴力解法
- 三、KMP算法原理
- 3.1 自动子串的指针
- 3.2 跳过多少个字符
- 3.3 next数组 - 暴力
- 3.4 next数组 - 求解
- 四 KMP实现
一 、前言
字符串匹配
import re
print(re.search('www', 'www.runoob.com').span()) # 在起始位置匹配
print(re.search('com', 'www.runoob.com').span()) # 不在起始位置匹配
SQL中的匹配
SELECT * FROM Persons
WHERE City LIKE '%lon%'
我们注意到这些都是需要用到字符串匹配的,我们再深入想一下,这些字符串是怎么匹配的呢?
二、 暴力解法
public class baoli {public static void main(String[] args) {String text = "ABABDABACDABABCABAB";//19String pattern = "ABABCABAB";//9int index = bruteForceMatch(text, pattern);if (index == -1) {System.out.println("Pattern not found in the text");} else {System.out.println("Pattern found at index " + index);}}public static int bruteForceMatch(String text, String pattern){int n = text.length();int m = pattern.length();for (int i = 0; i <= n - m; i++) {int j;for (j = 0; j < m; j++) {if (text.charAt(i + j) != pattern.charAt(j)) {break;}}if (j == m) {return i; // 匹配成功,返回起始位置}}return -1; // 匹配失败}
}
看到这种brute force暴力解法的时间复杂度为O(mn)
一个字一个字的匹配,一旦出错就匹配下一个
但是这样带来了巨大的浪费
三、KMP算法原理
KMP算法是用的这三位大佬的名字首字母,没有什么特殊含义
3.1 自动子串的指针
匹配失败,已经知道了前面读过了哪些char,所以移动子串的指针
3.2 跳过多少个字符
KMP算法会定义一个next数组,记录对应 可以跳过字符的个数
public static int kmpSearch(String text, String pattern) {int[] next = computeLPSArray(pattern);int i = 0; // text的指针int j = 0; // pattern的指针while (i < text.length()) {if (text.charAt(i) == pattern.charAt(j)) { // char匹配,都后移i++;j++;if (j == pattern.length()) {return i - j; // string匹配成功,返回起始位置}} else {if (j != 0) { // char匹配失败,pattern回退到上一个匹配的位置j = next[j - 1];} else { // 字符串第一个就匹配失败,直接后移i++;}}}return -1; // 匹配失败}
3.3 next数组 - 暴力
next数组:寻找子串中“相同前后缀的最长长度,不能是字符串本身”
那么如何获取这个next数组呢,当然首先可以想到for循环暴力求解
public static int[] bruteComputeLPSArray(String pattern) {int[] lps = new int[pattern.length()];int len = 0;for (int i = 1; i <= pattern.length() - 1; i++) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;lps[i] = len;} else {if (len != 0) {len = lps[len - 1];i--;} else {lps[i] = 0;}}}return lps;}
3.4 next数组 - 求解
下一步相同,那么直接就是2+1
下一步不同呢?
左边这部分前后缀 = 右边这部分前后缀
直接在左边进行查找即可
于是又开始,寻找下一个char是否相同
public static int[] computeLPSArray(String pattern) {int[] next = new int[pattern.length()];int len = 0; // 最长公共前后缀的长度int i = 1; // pattern的指针while (i < pattern.length()) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;next[i] = len;i++;} else {if (len != 0) {len = next[len - 1]; // 回退到前一个匹配的位置} else {next[i] = 0;i++;}}}return next;}
四 KMP实现
package com.KMP;public class KMPAlgorithm {public static void main(String[] args) {String text = "ABABDABACDABABCABAB";String pattern = "ABABCABAB";int index = kmpSearch(text, pattern);if (index == -1) {System.out.println("Pattern not found in the text");} else {System.out.println("Pattern found at index " + index);}}public static int kmpSearch(String text, String pattern) {int[] next = computeLPSArray(pattern);int i = 0; // text的指针int j = 0; // pattern的指针while (i < text.length()) {if (text.charAt(i) == pattern.charAt(j)) { // char匹配,都后移i++;j++;if (j == pattern.length()) {return i - j; // string匹配成功,返回起始位置}} else {if (j != 0) { // char匹配失败,pattern回退到上一个匹配的位置j = next[j - 1];} else { // (j == 0) 字符串第一个就匹配失败,直接后移i++;}}}return -1; // 匹配失败}public static int[] computeLPSArray(String pattern) {int[] next = new int[pattern.length()];int len = 0; // 最长公共前后缀的长度int i = 1; // pattern的指针while (i < pattern.length()) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;next[i] = len;i++;} else {if (len != 0) {len = next[len - 1]; // 回退到前一个匹配的位置} else {next[i] = 0;i++;}}}return next;}public static int[] bruteComputeLPSArray(String pattern) {int[] lps = new int[pattern.length()];int len = 0;for (int i = 1; i <= pattern.length() - 1; i++) {if (pattern.charAt(i) == pattern.charAt(len)) {len++;lps[i] = len;} else {if (len != 0) {len = lps[len - 1];i--;} else {lps[i] = 0;}}}return lps;}
}
相关文章:
![](https://img-blog.csdnimg.cn/80ae6277da0d4a7bb8870c0749609dc6.png)
KMP算法开荒
文章目录 一 、前言二、 暴力解法三、KMP算法原理3.1 自动子串的指针3.2 跳过多少个字符3.3 next数组 - 暴力3.4 next数组 - 求解 四 KMP实现 一 、前言 字符串匹配 import re print(re.search(www, www.runoob.com).span()) # 在起始位置匹配 print(re.search(com, www.run…...
![](https://www.ngui.cc/images/no-images.jpg)
XXL-JOB(2)
Glue模式 任务以源码的形式去维护调度中心,支持实时编译,无需指定JobHandler。 实际上是继承自JobHandler的java类代码,在执行器中运行,可以使用Resource/Autowire注入执行器里中的其他服务. 在执行器中添加service Service p…...
![](https://img-blog.csdnimg.cn/b9f7898c011c489692025c792cc66a3f.png)
Linux常用命令_网络命令、关机重启命令
文章目录 1. 网络命令1.1 网络命令: write1.2 网络命令: wall1.3 网络命令: ping1.4 网络命令: ifconfig1.5 网络命令: mail1.6 网络命令: last1.7 网络命令: lastlog1.8 网络命令: traceroute1.9 网络命令: netstat1.10 网络命令: setup1.11 挂载命令 2. 关机重启命令2.1 shut…...
![](https://img-blog.csdnimg.cn/8e702cecc43b4fd7a20b4f0f16c038b2.png)
用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part I
用Cmake build OpenCV后,在VS中查看OpenCV源码的方法 Part I 写在最前面,最近这段时间的工作需要用opencv,不仅是调包,还要能够看到opencv的源码。然后就跟着网上的教程实现了一遍,在实现过程中,遇到了不少…...
![](https://www.ngui.cc/images/no-images.jpg)
如何使用Docker搭建ZooKeepe集群
1、拉取镜像 # docker pull zookeeper:3.7.12、创建网络 Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定。在实际部署中,需要指定容器ip,不允许其自行分配ip,尤其在搭建集群时。可以通过docker netw…...
![](https://img-blog.csdnimg.cn/5548a27906574d278adb2b70f27acf90.png)
【javaweb】学习日记Day3 - Ajax 前后端分离开发 入门
目录 一、Ajax 1、简介 2、Axios (没懂 暂留) (1)请求方式别名 (2)发送get请求 (3)发送post请求 (4)案例 二、前端工程化 1、Vue项目-目录结构 2、…...
![](https://img-blog.csdnimg.cn/46631eb168e44db09de0829187878e6e.png)
SQL注入漏洞复现:探索不同类型的注入攻击方法
这篇文章旨在用于网络安全学习,请勿进行任何非法行为,否则后果自负。 准备环境 sqlilabs靶场 安装:详细安装sqlmap详细教程_sqlmap安装教程_mingzhi61的博客-CSDN博客 一、基于错误的注入 注入讲解 介绍 基于错误的注入(Err…...
![](https://img-blog.csdnimg.cn/6da6b915339441a885db8b86ef619d43.png)
大彩串口屏使用记录
写在最前面 屏幕型号 DC10600M070 IDE VisualTFT(官方) VSCode(lua编程) 用之前看一下官方那个1小时的视频教程就大概懂控件怎么用了,用官方的软件VisualTFT很简单 本文只是简单记录遇到的一些坑 lua编辑器 VisualTF…...
![](https://www.ngui.cc/images/no-images.jpg)
Qt http 的认证方式以及简单实现
http 的认证方式 基本认证(Basic Authentication): 基本认证是最简单的HTTP认证方式。客户端在请求头中使用Base64编码的用户名和密码进行身份验证由于仅使用Base64编码,基本认证并不安全,因此建议与HTTPS一起使用,以…...
![](https://img-blog.csdnimg.cn/4c14934fa6d6459497dc547c07995999.png)
【图像分割】实现snake模型的活动轮廓模型以进行图像分割研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
![](https://img-blog.csdnimg.cn/img_convert/24c840a370bed4916b7fafbffa5faad1.webp?x-oss-process=image/format,png)
【MongoDB系列】1.MongoDB 6.x 在 Windows 和 Linux 下的安装教程(详细)
本文主要介绍 MongoDB 最新版本 6.x 在Windows 和 Linux 操作系统下的安装方式,和过去 4.x 、5.x 有些许不同之处,供大家参考。 Windows 安装 进入官网下载 Mongodb 安装包,点此跳转,网站会自动检测当前操作系统提供最新的版本&…...
![](https://7078909xxh.oss-cn-shanghai.aliyuncs.com/csdn图床专用区/202308151303865.png)
5.网络原理之初识
文章目录 1.网络发展史1.1独立模式1.2网络互连1.3局域网LAN1.3.1基于网线直连1.3.2基于集线器组建1.3.3基于交换机组建1.3.4基于交换机和路由器组建1.3.4.1路由器和交换机区别 1.4广域网WAN 2.网络通信基础2.1IP地址2.2端口号2.3认识协议2.4五元组2.5 协议分层2.5.1 分层的作用…...
![](https://img-blog.csdnimg.cn/ee3df4ff1e384209868d441d079075a9.png)
【Linux】进程状态|僵尸进程|孤儿进程
前言 本文继续深入讲解进程内容——进程状态。 一个进程包含有多种状态,有运行状态,阻塞状态,挂起状态,僵尸状态,死亡状态等等,其中,阻塞状态还包含深度睡眠和浅度睡眠状态。 个人主页ÿ…...
![](https://img-blog.csdnimg.cn/c29fedd16e77474f9d30c91068709cf1.jpeg)
ASEMI快恢复二极管APT80DQ60BG特点应用
编辑-Z APT80DQ60BG参数描述: 型号:APT80DQ60BG 最大峰值反向电压(VRRM):600V 最大直流阻断电压VR(DC):600V 平均整流正向电流(IF):80A 非重复峰值浪涌电流(IFSM):600A 工作接点温度和储存温度(TJ, …...
![](https://img-blog.csdnimg.cn/14ca0f01aa7f4c609e4cd561e4a4cb2a.png)
【Python爬虫】使用代理ip进行网站爬取
前言 使用代理IP进行网站爬取可以有效地隐藏你的真实IP地址,让网站难以追踪你的访问行为。本文将介绍Python如何使用代理IP进行网站爬取的实现,包括代理IP的获取、代理IP的验证、以及如何把代理IP应用到爬虫代码中。 1. 使用代理IP的好处 在进行网站爬…...
![](https://img-blog.csdnimg.cn/4cba1cdb9778424c92c4c747bba818c1.png#pic_center)
识别图片中的文字
前言 PearOCR 是一款免费无限制网页版文字识别工具。 优点如下: 免费:完全免费,没有任何次数、大小限制,可以无限使用; 安全:全部数据本地运算,所有图片均不会被上传; 智能…...
![](https://img-blog.csdnimg.cn/0e4251f50c014ea8a0180f0c69d7c7e2.png)
第七章:借阅管理【基于Servlet+JSP的图书管理系统】
借阅管理 1. 借书卡 1.1 查询借书卡 借书卡在正常的CRUD操作的基础上,我们还需要注意一些特殊的情况。查询信息的时候。如果是管理员则可以查询所有的信息,如果是普通用户则只能查看自己的信息。这块的控制在登录的用户信息 然后就是在Dao中处理的时候需…...
![](https://img-blog.csdnimg.cn/610a7cdf1ec34295805241713716e07e.png)
算法 for GAMES
栈 #include <iostream> #include <stack>int main() {std::stack<int> intStack;// 压入元素到堆栈intStack.push(5);intStack.push(10);intStack.push(15);// 查看堆栈顶部元素std::cout << "Top element: " << intStack.top() <…...
![](https://img-blog.csdnimg.cn/0b8094281dee496fb5804b6d6d636fd1.png)
自研分布式IM-HubuIM RFC草案
HubuIM RFC草案 消息协议设计 基本协议 评估标准 【性能】协议传输效率,尽可能降低端到端的延迟,延迟高于200ms用户侧就会有所感知 【兼容】既要向前兼容也要向后兼容 【存储】减少消息包的大小,降低空间占用率,一个字节在亿…...
![](https://img-blog.csdnimg.cn/0c0e510a86714e6eb4bf4129f98f8c87.png)
tableau基础学习1:数据源与绘图
文章目录 读取数据常用绘图方法1. 柱状图2. 饼图3. 散点图4. 热力图 第一部分是一些较容易上手的内容,以及比较常见的可视化内容,包括:柱状图、饼图、散点图与热力图 读取数据 打开界面后,选择数据源之后就可以导入数据…...
![](https://www.ngui.cc/images/no-images.jpg)
探索经典算法问题与解决方案
探索经典算法问题与解决方案 在计算机科学领域,有许多经典算法问题需要我们思考和解决。本文将深入介绍一些著名的经典算法问题,包括旅行商问题、背包问题的变种、N皇后问题、钢条切割问题、最大子数组和问题、最长公共子串问题以及矩阵连乘问题&#x…...
![](https://img-blog.csdnimg.cn/16e416f1a0994a9fa42c0f742820695f.png)
【Linux】DNS系统,ICMP协议,NAPT技术
遏制自己内心的知识优越感,才能让你发自内心的去尊重他人,避免狂妄自大,才能让你不断的丰富自己的内心。 文章目录 一、DNS系统1.DNS服务器返回域名对应的ip2.使用dig工具分析DNS过程3.浏览器中输入url后发生的事情? 二、ICMP协议…...
![](https://img-blog.csdnimg.cn/img_convert/1143fcb4c5170262d668d0212aaea1d1.webp?x-oss-process=image/format,png)
BI技巧丨Window应用之同环比
白茶曾介绍过OFFSET可以用来解决同环比的问题,其实微软最近推出的开窗函数WINDOW也可以用来解决同环比。 WINDOW函数基础语法 WINDOW ( from[, from_type], to[, to_type][, <relation>][, <orderBy>][, <blanks>][, <partitionBy>][, &l…...
![](https://img-blog.csdnimg.cn/ffe68a45f4a24675b858fefc541c728e.png)
【Mac】编译Spring 源码和Idea导入
今天我们开始Spring源码的阅读之旅。阅读Spring的源码的第一步当然是编译Spring源码。首先我们要去GitHub上将spring源码给clone下来。 笔者编译环境如下: Spring版本:5.28 https://github.com/spring-projects/spring-framework/tree/v5.2.8.RELEASE …...
![](https://img-blog.csdnimg.cn/229cfe889f124e1d9b6b9db6ee14331e.png#pic_center)
手把手教你用 ANSYS workbench
ANSYS Workbench ANSYS Workbench是一款基于有限元分析(FEA)的工程仿真软件。其基本概念包括: 工作区(Workspace):工程仿真模块都在此区域内,包括几何建模、网格划分、边界条件设置、分析求解等…...
![](https://img-blog.csdnimg.cn/8eb58e44c8f14385906e286b09dd9b1a.png)
Kotlin开发笔记:协程基础
Kotlin开发笔记:协程基础 导语 本章内容与书的第十五章相关,主要介绍与协程相关的知识。总的来说,本文将会介绍Kotlin中关于异步编程的内容,主要就是与协程有关。在Kotlin中协程是利用continuations数据结构构建的,用…...
![](https://www.ngui.cc/images/no-images.jpg)
自学设计模式(简单工厂模式、工厂模式、抽象工厂模式)
使用工厂模式来生产某类对象(代码简化且容易维护,类之间有血缘关系,可以通过工厂类进行生产); 简单工厂模式(用于创建简单对象) 对于简单工厂模式,需要的工厂类只有一个࿱…...
![](https://www.ngui.cc/images/no-images.jpg)
NFS:使⽤ NFS 为远程客户端提供共享文件系统
写在前面 分享一些 nfs 搭建的笔记考试顺便整理内容涉及 nfs 服务端客户端的搭建配置理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的&…...
![](https://www.ngui.cc/images/no-images.jpg)
2022-kaggle-nlp赛事:Feedback Prize - English Language Learning(超多注释讲解)
2022-kaggle-nlp赛事:Feedback Prize - English Language Learning 零、比赛介绍 比赛地址Feedback Prize - English Language Learning | Kaggle 0.1 比赛目标 写作是一项基本技能。可惜很少学生能够磨练,因为学校很少布置写作任务。学习英语作为第…...
![](https://img-blog.csdnimg.cn/8a6e9c1188934ae098dadc7d06d5cfc1.png)
第十三课 宾语从句
文章目录 前言一、宾语从句1、主语及物动词宾语从句2、主语双宾动词间接宾语直接宾语3、主语特定及物动词宾语从句(作宾语)宾补4、主语be某些形容词宾语从句5、动词不定式后面的宾语从句6、动名词后面的宾语从句7、介词后面的宾语从句9、间接引语 前言 一…...
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
阿里云可以做哪些网站吗/seo优化公司
Servlet最主要作用就是处理客户端请求并作出回应,为此,针对每次请求,Web容器在调用service()之前都会创建两个对象,分别是HttpServletRequest和HttpServletResponse。其中HttpServletRequest封装HTTP请求消息,HttpServ…...
![](https://img-blog.csdnimg.cn/img_convert/ad1b06ad09d887417d1de5903a6bce7f.png)
未及时取消网站备案/营销网络的建设怎么写
转自:https://blog.csdn.net/morixinguan/article/details/51799668 作者:Engineer-Bruce_Yang就像下面的这个表之前写过上面这个标题的一篇文章,讲的是以位移的方式去遍历表中的数据,效率非常高,但是,如…...
![](http://upload-images.jianshu.io/upload_images/2085791-459dc9b052f3c62d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
成都品牌包装设计/企业网站优化哪家好
2019独角兽企业重金招聘Python工程师标准>>> 方法1 - 使用Eclipse Eclipse里新建一个服务器: 服务器类型选择SAP Cloud Platform: 点Finish,成功创建了一个Server: Eclipse里选择要部署的项目,右键->…...
![](https://img-blog.csdnimg.cn/img_convert/a3e4913e9cd11bd95bd1282b36a2b935.png)
做网站配置好了找不到服务器/长沙seo网络营销推广
简单是可靠的前提条件真正程序员从来不写代码的注释,如果代码非常难写,那么同样代码的注释也会非常难懂 看看当前计算机程序糟糕的事态,软件开发明显一直是一门妖术,其仍然不能被称为一个工程学。–比尔.克林顿 美国前总统...
![](/images/no-images.jpg)
正规专业的互联网代做毕业设计网站/美国搜索引擎浏览器
打开网址 http://idea.lanyus.com/ 选择获取注册码,复制生成的验证码 安装完成后,打开软件,依次选择菜单栏 Help -> Register-> Activation code ->输入复制验证码->确定完成。...
![](/images/no-images.jpg)
建设一个班级网站的具体步骤/外链工厂
阅读使人充实,会谈使人敏捷,写作使人精确。——培根Linux 系统管理员试卷样题(中级)一、选择题:1、linux 操作系统内核创始人是( )A. Bill GatesB. Richard StallmanC. Linus TorvaldsD. Dennis M Ritchie 、Ken Thompson2、在linux 中有关I…...