KMP算法Java实现

KMP算法Java实现

KMP算法简介

KMP算法是一种高效的字符串匹配算法,核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数已达到快速匹配的目的。通过一个next()函数实现,该函数包含了模式串的局部匹配信息,KMP算法的时间复杂度是O(m+n)

算法步骤

  1. 寻找最大前缀后缀公共子串长度

对于P = p0 p1 …pj-1 pj,寻找模式串P中长度最大且相等的前缀和后缀。如果存在p0 p1 …pk-1 pk = pj-k pj-k+1…pj-1 pj,那么在包含pj的模式串中有最大长度为k+1的相同前缀后缀。

(1)以模式串ABAB为例,子串ABA有长度为1的相同前缀后缀A,子串ABAB有长度为2的相同前缀后缀AB(相同前缀后缀长度k+1为2)。

模式串ABAB
最大前缀后缀公共子串长度0012
  1. 求next数组

next数组是除了当前字符外的最长相同前缀后缀,通过第一步得到最大长度后,将整体右移一位,然后初值赋值为-1。

模式串ABAB
next数组-1001
  1. 根据next数组进行匹配

匹配失败,j = next[j],模式串向右移动的位数为j - next[j]。也就是说模式串的后缀pj-k pj-k+1, …, pj-1 跟文本串si-k si-k+1, …, si-1匹配成功,但pj 跟si匹配失败时,因为next[j] = k,相当于在不包含pj的模式串中有最大长度为k 的相同前缀后缀,即p0 p1 …pk-1 = pj-k pj-k+1…pj-1,故令j = next[j],从而让模式串右移j - next[j] 位,使得模式串的前缀p0 p1 …pk-1 对应着文本串si-k si-k+1, …, si-1,而后让pk 跟si 继续匹配。

算法实例

public class KMP {public static void main(String[] args) {String str1 = "BBC ABCDAB ABCDABCDABDE";String str2 = "ABCDABD";//使用模式串获得next数组int[] next = getNext(str2);int index = kmp(str1, str2, next);System.out.println(index);}private static int kmp(String source, String pattern, int[] next) {char[] s = source.toCharArray();char[] p = pattern.toCharArray();int sLen = s.length;int pLen = p.length;for (int i=0,j=0;i<sLen;i++) {while(j>0 && s[i] != p[j]) {j = next[j-1];}if (s[i] == p[j]) {j++;}if (j == pLen) {return i-j;}}return -1;}//获取模式串的部分匹配表private static int[] getNext(String dest) {char[] p = dest.toCharArray();int pLen = p.length;int[] next = new int[pLen];for (int i=0;i<pLen;i++) {while(j>0 && p[i] != p[j]) {j = next[j-1];}if (p[i] == p[j]) {j++;}next[i] = j;}return next;}/*** 获得next数组* @param next next数组* @param t 模式串* @return int[] 返回数组*/private static void getNext(int[] next, String t){//对于模式串中每个元素tj,都存在一个实数k,//使得模式串t开头的k个字符(t0t1...tk-1)依次与tj前面的k个字符相同//如果这样的k有多个,则取最大的一个int j = 0, k = -1;next[0] = -1;char[] p = t.toCharArray();int len = p.length;while(j < len){if(k == -1 || p[j] == p[k]){j++;k++;next[j] = k; //如果p[j]与p[k]相同了,最大前后缀长度加1}else{k = next[k];}}}
}

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

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

相关文章

Python Selenium UI自动化测试

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

locked勒索病毒:变种_locked袭击了您的计算机?

导言&#xff1a; ._locked勒索病毒&#xff0c;一种近年来日益猖獗的网络安全威胁&#xff0c;已经引起了全球范围内的广泛关注。该病毒通过电子邮件附件、恶意网站和漏洞利用等多种方式传播&#xff0c;一旦感染系统&#xff0c;就会加密受感染设备上的所有文件&#xff0c;…

IO-DAY8

使用消息队列去实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复 A终端&#xff1a; #include<myhead.h> typedef struct msgbuf {lon…

Vite 中配置压缩代码体积

在 Vite 中配置压缩代码体积可以使用插件 vite-plugin-compress。以下是在 vite.config.js 中配置压缩代码体积的步骤: 安装 vite-plugin-compress 插件: npm install vite-plugin-compress --save-dev在 vite.config.js 中配置 vite-plugin-compress 插件: import { def…

python:笨小猴

文章目录 前言一、题意输入格式:输出格式: 二、代码1.代码的实现2.读入数据 前言 本题复习了素数的判断以及count函数求数列中某个元素的个数的使用 一、题意 笨小猴的词汇量很少&#xff0c;所以每次做英语选择题的时候都很头疼。但是他找到了一种方法&#xff0c;经试验证明…

设计模式学习笔记 - 设计模式与范式 -行为型:8.状态模式:游戏、工作流引擎中常用的状态机是如何实现的?

概述 本章学习状态模式。在实际的开发中&#xff0c;状态模式并不是很常用&#xff0c;但是在能够用到的场景里&#xff0c;它可以发挥很大的作用。从这一点上看&#xff0c;它有点像我们之前讲到的组合模式。 状态模式一般用来实现状态机&#xff0c;而状态机常用在游戏、工…

sqlite建立数据库

在做一些简单的实验项目的时候&#xff0c;sqlite比较好用&#xff08;MacOS验视环境&#xff09;。相关包下载网页&#xff1a;https://www.sqlite.org/download.html 1 创建数据文件目录 cd /<project_path> mkdir database cd /database2 创建数据库 在当前目录&am…

【C++】用红黑树封装map和set

我们之前学的map和set在stl源码中都是用红黑树封装实现的&#xff0c;当然&#xff0c;我们也可以模拟来实现一下。在实现之前&#xff0c;我们也可以看一下stl源码是如何实现的。我们上篇博客写的红黑树里面只是一个pair对象&#xff0c;这对于set来说显然是不合适的&#xff…

基于JAVA的汽车售票网站论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对汽车售票信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

挑战30天C++基本入门(DAY13--搜索与回溯)

#我们在DFS的搜索学习中涉及到了回溯的操作&#xff0c;那什么是回溯呢&#xff1f; 就是说我们在标记数组之后&#xff0c;我们进行解标记的操作&#xff0c;同时再次进入递归&#xff0c;出现新的情况的操作&#xff0c;这就叫做回溯操作。 如果现在有这样一道题&#xff1a…

2024【华南理工大学综合评价招生】解读

文章目录 导语报名条件及类别符合以下两个条件的考生均可申请报名申请报名考生分为以下两类 招生专业及选考科目报名方式与选拔程序报名时间和方式网上提交材料材料初审缴费学校考核录取 学费监督机制与其他说明联系方式 导语 2024 , 04 , 03 2024,04,03 2024,04,03&#xff0c…

C++类设计:一个比较复杂的日志类 支持多线程、文件切换、信息缓存(源码)

初级代码游戏的专栏介绍与文章目录-CSDN博客 github位置&#xff1a;codetoys/ctfc.git src/env/myLog.h和.cpp 这个类功能细节比较多&#xff0c;因为是长期使用的版本&#xff0c;累积了各种功能。之前介绍的两个是我的测试代码用的版本&#xff0c;非常简单&#xff0c;那…

AI技术将影响更长远,比如未来的就业形势

随着人工智能渗透到工作场所&#xff0c;人类将需要掌握新的工作技能。 AI作为新技术已经开始扰乱就业市场了。对于最新的AI人工智能技术&#xff0c;经济学家、教育工作者、监管机构、商业分析师以及相关领域专家预测&#xff0c;在不久的将来&#xff0c;人工智能一代将需要…

AI智能调色解决方案,节省了企业的时间和人力成本

如何确保图片、视频的色彩准确、生动&#xff0c;成为企业提升品牌形象和传播效果的重要课题。美摄科技凭借领先的AI技术&#xff0c;推出全新的AI智能调色解决方案&#xff0c;以智能化、精细化的调色方式&#xff0c;帮助企业轻松驾驭色彩&#xff0c;展现视觉魅力。 美摄科…

vue改变子组件props属性值

1.使用v-model和$emit <!-- 父组件 --> <template><ChildComponent v-model="propValue" /> </template><script setup> import { ref } from vue; import ChildComponent from ./ChildComponent.vue;const propValue = ref(initial …

2.小明的背包1

2.小明的背包1 - 蓝桥云课 (lanqiao.cn) 小明的背包1 题目描述 小明有一个容量为V的背包。 这天他去商场购物&#xff0c;商场一共有件物品&#xff0c;第件物品的体积为wi&#xff0c;价值为 vi。 小明想知道在购买的物品总体积不超过V的情况下所能获得的最大价值为多少&#…

CSDN 广告太多,停更通知,转移到博客园

文章目录 前言新博客地址 前言 CSDN的广告实在是太多了&#xff0c;我是真的有点忍不了。直接把广告插在我的文章中间。而且我已经懒得找工作了&#xff0c;我当初写CSDN的目的就是为了找工作&#xff0c;有个博客排名。当时经济环境实在是太差了。我也没必要纠结这个2000粉丝…

C++逻辑运算符

假设变量 A 的值为 1&#xff0c;变量 B 的值为 0 则&#xff1a; 运算符描述实例&&称为逻辑与运算符。如果两个操作数都非零&#xff0c;则条件为真。(A && B) 为假。||称为逻辑或运算符。如果两个操作数中有任意一个非零&#xff0c;则条件为真。(A || B) …

Facebook直播延迟过高是为什么?

在进行Facebook直播 时&#xff0c;高延迟可能会成为一个显著的问题&#xff0c;影响观众的观看体验和互动效果。以下是一些导致Facebook直播延迟过高的可能原因&#xff1a; 1、网络连接问题 网络连接不稳定或带宽不足可能是导致Facebook直播延迟的主要原因之一。如果您的网络…

EDM邮件群发推广多少钱?有哪些优势?

电子邮件营销&#xff08;Electronic Direct Mail, EDM&#xff09;以其高性价比、精准定向与可度量效果的优势&#xff0c;成为众多企业不可或缺的营销策略。云衔科技&#xff0c;作为企业数字广告营销和SaaS软件服务的领军者&#xff0c;以其创新的智能EDM邮件营销系统解决方…