KMP字符串 (简单清晰/Java)

Kmp算法

解决问题:
字符串匹配问题
怎么解决?
前缀表+next[]数组
#分析
先看暴力做法:

  1. 两层for循环,一层遍历文本串,一层遍历模式串(子串)
  2. 对应的每个字符进行匹配,匹配成功就 i+ +j+ + 继续匹配
  3. 匹配不成功则break,退出循环.
    那这样做时间复杂度为O(m*n)

再看Kmp做法
1.先将模式串和文本串一 一匹配,遇到冲突,即匹配不成功时,需要退一位继续匹配。
那这一位怎么退?
借助前缀表!

2.需要求模式串的前缀表,怎么求?
先引入一个ne
数组,next数组的求算相当于双指针算法
从左至右开始遍历,计算前缀和后缀最长相等的长度
最后,得到的是一个升序序列,序列中的值便是退一位的索引,即ne[j]。

3.借助ne[]数组,进行退一位处理。
如果当前冲突了,那我们就找到模式串冲突位置j的前一位即ne[j]。
这里的话p数组做了往前移动一位处理,那这样对应的每个j冲突的退一位索引直接就是ne[j]。

4.退一位处理后,会确保ne[j]的前缀和文本串冲突位置前的串的后缀相同。
那这样就开始在 j=ne[j] 的下一位开始与冲突位置进行匹配。

如果匹配不到,则继续退一位处理,继续匹配。
如果匹配得到,则记录i的位置,注意i保留的是匹配成功的最后一位。

所以,答案下标等于 i-n+1 ,但是这里写法是从下标1开始,所以 i-n+1-1=i - n

分析一下KMP算法的时间复杂度:
先for循环遍历一下,移动j的位置,最多前移m 次、后移每次,总计为2*m

所以Kmp的时间复杂度O(2*m)=O(m)

过程模拟图

分析图

在这里插入图片描述

前缀表计算展开图
注意:
前缀是不含尾字母的所有子串
后缀是不含首字母的所有子串
找到最长相等的前缀和后缀长度即可

图1

在这里插入图片描述

图二

在这里插入图片描述

图三

在这里插入图片描述

代码

import java.io.*;
public class Main{public static void main(String []args) throws NumberFormatException, IOException {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));int N=100010,M=1000010;int n =  Integer.parseInt(in.readLine());String P = in.readLine();char []p = new char[N];//输入的数组下标从1开始for(int i=1;i<=n;i++) {p[i]=P.charAt(i-1);//将字符串P的每个字符存入字符数组}int m = Integer.parseInt(in.readLine()); String S = in.readLine();char []s = new char[M];for(int i=1;i<=m;i++) {s[i] = S.charAt(i-1);//将字符串S的每个字符存入字符数组}int ne[]=new int [N];//前缀表//i=1时,ne[1]=0;所以从i=2开始即可。for(int i=2,j=0;i<=n;i++) {//j从0开始,进入循环会加上1,主要是为了做退格处理。while(j>0&&p[i]!=p[j+1])j=ne[j];//那么我们去找他的前一位来进行匹配,即往前退一格,再比较。if(p[i]==p[j+1])j++;//匹配相等的话,则j++ne[i]=j;//更新ne数组i的值为j}for(int i=1,j=0;i<=m;i++) {//j+1是退格定位到j之后的位置再继续比较。while(j>0&&s[i]!=p[j+1])j=ne[j];if(s[i]==p[j+1])j++;//匹配成功,则i、j继续往下走if(j==n) {//i最后记录的是字符串匹配成功的最后一位,需要i-n+1.//但是这里的下标从1开始,需要减1,所以是i-n。out.write((i-n)+" ");//保存当前满足条件的ne[j]的位置,接下来继续匹配可能会用到。j=ne[j];}}out.flush();out.close();in.close();		}
}

参考资源

理论:
https://b23.tv/BTna3qX
next[]
https://b23.tv/bI8oAJG

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

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

相关文章

大数据——协同过滤推荐算法:线性回归算法

推荐系统中的协同过滤算法一般分为两大类&#xff1a; 基于行为的协同过滤算法(Memory-Based CF)&#xff0c;利用用户行为数据计算相似度&#xff0c;包括用户之间的相似度和物品之间的相似度。基于模型的协同过滤算法(Model-Based CF)&#xff0c;利用机器学习算法预测用户的…

华纳云:Ubuntu安装Drupal报错怎么解决

在安装 Drupal 过程中遇到错误可能是由于各种原因引起的。以下是一些常见的安装 Drupal 时可能遇到的问题以及相应的解决方法&#xff1a; 数据库连接问题&#xff1a; 安装 Drupal 时需要连接数据库&#xff0c;如果数据库连接配置不正确&#xff0c;可能会导致安装失败。确保…

如何将jar包部署到宝塔

尝试多种方式上传&#xff0c;但启动一直失败&#xff0c;这种方式亲测是好使的 项目内修改位置 在pom.xml文件中将mysql的scope改成provided&#xff0c;如果是固定的版本号会出现问题 之后就可以打包啦&#xff0c;直接点击maven中的package 找到打包文件的位置&#xff…

Object.values()

Object.values() 是ES2017新增的一个对象方法,它可以将一个对象自身的所有可枚举属性值,组成一个数组返回。 基本语法: Object.values(obj)示例: jsCopy codeconst obj {foo: bar,baz: 42 };Object.values(obj); // [bar, 42]Object.values()的特点: 只返回可枚举的属性值…

免费插件-illustrator-Ai插件-印刷功能-二维码生成

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.示例5.1.QR常用二维码5.2.PDF4175.3.EAN13 6.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;进行二维码生成。首先从下载网址下载这款插件 https://download.csd…

MySQL之深入InnoDB存储引擎——redo日志

文章目录 一、为什么需要redo日志二、redo日志的类型1&#xff09;简单的redo日志类型2&#xff09;复杂的redo日志类型 三、Mini-Transaction四、redo日志的写入过程五、redo日志文件1、刷盘时机2、redo日志文件组 六、log sequence number1、lsn的引入2、flushed_to_disk_lsn…

npm ERR! cb.apply is not a function

当NPM版本过低导致 npm ERR! cb.apply is not a function 1. win r 打开运行&#xff0c;输入%appdata% 2. 删除 npm 和 npm-cache 文件夹 3. 执行npm cache clean --force命令 如果还不行&#xff0c;就执行卸载Node.js重新安装。

java 文件/文件夹复制,添加压缩zip

复制文件夹,并压缩成zip 需求&#xff1a;创建A文件夹&#xff0c;把B文件夹复制到A文件夹。然后把A文件夹压缩成zip包 public static void main(String[] args) throws Exception {try {String A "D:\\dev\\program";String B "D:\\program";// 创建临…

Vue 插槽 slot

solt 插槽需要分为 2.6.0 版本以上和 2.6.0版本以下。 2.6.0 版本以下的 slot 插槽在&#xff0c;2.x版本将继续支持&#xff0c;但是在 Vue 3 中已被废弃&#xff0c;且不会出现在官方文档中。 作用 插槽 prop 允许我们将插槽转换为可复用的模板&#xff0c;这些模板可以基于…

Qt应用开发(基础篇)——LCD数值类 QLCDNumber

一、前言 QLCDNumber类继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt的一个基础小部件。 框架类QFrame介绍 QLCDNumber用来显示一个带有类似lcd数字的数字&#xff0c;适用于信号灯、跑步机、体温计、时钟、电表、水表、血压计等仪器类产品的数值显示。 QLCDNu…

【CSS】文本效果

文本溢出、整字换行、换行规则以及书写模式 代码&#xff1a; <style> p.test1 {white-space: nowrap; width: 200px; border: 1px solid #000000;overflow: hidden;text-overflow: clip; }p.test2 {white-space: nowrap; width: 200px; border: 1px solid #000000;ove…

2023年Q2天猫洗衣机行业品牌销售排行榜(淘宝天猫数据)

洗衣机作为普及率极高的家电之一&#xff0c;如今已经成为我们生活中不可或缺的一部分。由于洗衣机的普及率较高&#xff0c;因此虽其市场规模庞大&#xff0c;但如今要使洗衣机呈现规模化增长的可能性还是比较小的。不过&#xff0c;随着用户需求及产品的升级&#xff0c;洗衣…

【C++中的pair类型】用于将两个不同类型的元素组合成一个单元,即key-value

文章目录 1、定义和初始化2、使用方式 1、定义和初始化 pair<type1, type2> p; // 初始化方法有3种 pair<int, string> p make_pair(1, "one"); pair<int, string> p {1, "one"}; pair<int, string> p(1, "one");2、…

【docker】 运行bytetrack 构建映像失败 使用docker删除之前构建的映像

1 Docker删除docker build失败的images docker images | grep "<none>" | awk {print $3} | xargs docker rmi 2 Docker删除启动失败的image docker ps -a | awk {if (length($2) 12){print $1}} | xargs docker rm

Apipost接口测试断言

常用断言直接点右边栏 断言list&#xff1a; // 断言json数组长度 apt.assert(response.json.data.data.length20); // 断言json数组中的某个对象 apt.assert(response.json.data.data[0].docid1482);

EvilBox One靶场笔记

EvilBox: One靶场笔记 信息收集 先fscan找主机192.168.1.102 namp扫端口 开放80,22端口 然后扫目录 └─$ gobuster dir -r -u http://192.168.1.102/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,bak,html在扫secret目录&#xff0c;找…

c++ 子数组动态规划问题

1.最大子数组和 力扣 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5…

基于Kubeadm部署k8s集群:下篇

继续上篇内容 目录 7、安装flannel 8、节点管理命令 三、安装Dashboard UI 1、部署Dashboard 2、开放端口设置 3、权限配置 7、安装flannel Master 节点NotReady 的原因就是因为没有使用任何的网络插件&#xff0c;此时Node 和Master的连接还不正常。目前最流行的Kuber…

微服务04-elasticsearch

1、es概念 1.1 文档和字段 elasticsearch是面向**文档(Document)**存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中: 而Json文档中往往包含很多的字段(Field),类似于数据库中的列。 1.2 索引和映射 索引(…

Visual Studio 2019 详细安装教程(图文版)

前言 Visual Studio 2019 安装包的下载教程、安装教程 教程 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 ********文章附有百度网盘安装包链接********* 系列文章 第一篇&#xff1a;Visual Studio 2019 详细安装教…