KMP算法(java)next数组和next函数修正值

BF算法

最简单直观的模式匹配算法是BF(Brute-Force)算法。

模式匹配不一定是从主串的第一个位置开始,可以指定主串中查找的起始位置pos。如果采用字符串顺序存储结构,可以写出不依赖于其他串操作的匹配算法。

最坏情况下的平均时间复杂度是O(nxm)

【算法步骤】

KMP算法

简介:

  • 这种改进算法是由 Knuth、 Morris 和 Pratt 同时设计实现的, 因此简称KMP算法。
  • 此算法可以在O(n+ m)的时间数量级上完成串的模式匹配操作。
  • 其改进在千:每当一趟匹配过程 中出现字符比较不等时,不需回溯 i 指针,而是利用已经得到的 ”部分匹配" 的结果将模式 向右 "滑动“ 尽可能远的一段距离后,继续进行比较。

算法实现

public class Main {public static int KMP(String str,String substr,int pos){if(pos<0 || pos>str.length()-substr.length()-1){return -1;}int[] next = new int[substr.length()];
//        getNext(substr,next);getNextVal(substr,next);int i = pos;int j = 0;while (j<substr.length() && i<str.length()){if( j==-1 || str.charAt(i)==substr.charAt(j)){i++;j++;}else {j = next[j];}}if (j==substr.length()){return i - substr.length();}else {return -1;}}public static void getNext(String str,int[] next){if(str.isEmpty()){return;}next[0] = -1;next[1] = 0;int k = 0; //前缀指向的位置int i = 2; //当前next数组的值while (i<str.length()){//以当前字符为界,前缀和后缀的值一样if(k==-1 || str.charAt(k)==str.charAt(i-1)){ //next[i] = k+1;k++;i++;}else {k = next[k];}}}// 修正的nextval 数组public static void getNextVal(String str,int[] nextval){if(str.isEmpty()){return;}nextval[0] = -1;nextval[1] = 0;int k = 0;int i = 2;while (i<str.length()){if(k==-1 || str.charAt(k)==str.charAt(i-1)){if(str.charAt(k+1) != str.charAt(i)){nextval[i] = k+1;}else{nextval[i]=nextval[k+1];}k++;i++;}else {k = nextval[k];}}}public static void main(String[] args) {String str = "ababcabcdabcdefg";String sub = "abcd";int pos = 6;int x = KMP(str, sub, pos);System.out.println(x);}
}

next[0] =-1 和next[1] =0 的原因?

注意:k 的值就是我们所说的, 子串匹配失败后 i 移动(回退)到的位置 

next[1] =0  : 即第二个字符匹配失败后,只能回退到第一个字符。

next数组的值,是前缀和后缀相同的长度。

假设字符串为:“aab",则charAt(0) = 'a',charAt(2-1) = 'a',next[2]=1;

假设字符串为:“aba",则charAt(0) = 'a',charAt(2-1) = 'b',next[2]=0;

参考:

Java【KMP算法】大白话式详细图文解析(附代码)_java kmp算法-CSDN博客

补充知识:

Java String类的常用方法使用方法_java中string常用方法-CSDN博客

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

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

相关文章

matlab基础例题

1. MATLAB 命令窗口中可用____命令清除工作区中的变量&#xff1b;用____命令清除命令窗口中的内容。 2. MATLAB 中的运算包括________________。 3. MATLAB 中的 M 文件有_____________。 4. MATLAB 中的程序控制结构包括___________. 5.已知矩阵 A [1 2 3;4 5 6;7 8 9],A…

支付宝租赁小程序的优势与应用前景分析

内容概要 在这个快节奏的时代&#xff0c;租赁服务越来越成为大家生活中的一部分。而支付宝租赁小程序正是这个大潮流中的一颗璀璨明珠。通过简单易用的界面和强大的功能&#xff0c;这个小程序不仅让用户在租赁过程中获得了前所未有的便利&#xff0c;也为商家提供了新的商业…

Elasticsearch 中的热点以及如何使用 AutoOps 解决它们

作者&#xff1a;来自 Elastic Sachin Frayne 探索 Elasticsearch 中的热点以及如何使用 AutoOps 解决它。 Elasticsearch 集群中出现热点的方式有很多种。有些我们可以控制&#xff0c;比如吵闹的邻居&#xff0c;有些我们控制得较差&#xff0c;比如 Elasticsearch 中的分片分…

【H2O2|全栈】JS进阶知识(七)ES6(3)

目录 前言 开篇语 准备工作 递归 概念 形式 优缺点 案例 数组求和 斐波那契数列 递归查找数据 柯里化 概念 形式 什么时候使用柯里化&#xff1f; 多维数组扁平化 多维数组 扁平化 利用flat() 与字符串相互转化 与JSON字符串相互转化 some()&#xff0c;…

字符数组和字符指针

为什么C程序里面不能对字符数组进行重新赋值而可以在控制台进行输入赋值&#xff1f; 在C语言中&#xff0c;字符数组&#xff08;char array&#xff09;和字符指针&#xff08;char pointer&#xff09;是两种不同的数据类型&#xff0c;它们在内存中的存储方式和使用方式有…

【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍

文章目录 前言一、Zachman架构二、ToGAF架构三、FEA架构四、DoDAF 前言 企业架构&#xff08;Enterprise Architecture&#xff0c;EA&#xff09;是指企业在信息技术和业务流程方面的整体设计和规划。 最近接触到“企业架构”这个概念&#xff0c;转念一想必定和我们软件架构…

迷宫题解 题目ID:8015

题目描述 时间限制&#xff1a; 1s 空间限制&#xff1a;32M 题目描述&#xff1a; 给定一个N∗M 方格的迷宫&#xff0c;每个方格最多经过一次&#xff0c;且迷宫里有 T 处障碍&#xff0c;障碍处不可通过。 在迷宫中有上下左右四种移动方式&#xff0c;每次只能移动一个方…

Kafka Stream实战教程

Kafka Stream实战教程 1. Kafka Streams 基础入门 1.1 什么是 Kafka Streams Kafka Streams 是 Kafka 生态中用于 处理实时流数据 的一款轻量级流处理库。它利用 Kafka 作为数据来源和数据输出&#xff0c;可以让开发者轻松地对实时数据进行处理&#xff0c;比如计数、聚合、…

Python中常用的内置函数介绍

1、生成器&#xff08;Generator&#xff09;&#xff1a; 通过列表生成式&#xff0c;我们可以直接创建一个列表。但是&#xff0c;受到内存限制&#xff0c;列表容量肯定是有限的。而且&#xff0c;创建一个包含100万个元素的列表&#xff0c;不仅占用很大的存储空间&#x…

基于python Django的boss直聘数据采集与分析预测系统,爬虫可以在线采集,实时动态显示爬取数据,预测基于技能匹配的预测模型

本系统是基于Python Django框架构建的“Boss直聘”数据采集与分析预测系统&#xff0c;旨在通过技能匹配的方式对招聘信息进行分析与预测&#xff0c;帮助求职者根据自身技能找到最合适的职位&#xff0c;同时为招聘方提供更精准的候选人推荐。系统的核心预测模型基于职位需求技…

vulhub之fastjson

fastjson 1.2.24 反序列化 RCE 漏洞(CVE-2017-18349) 漏洞简介 什么是json json全称是JavaScript object notation。即JavaScript对象标记法,使用键值对进行信息的存储。举个简单的例子如下: {"name":"BossFrank", "age":23, "isDevel…

Scala案例:全文单词统计

2.txt内容如下 Thank you very much.Well I want to thank you all very much this is great, these are our friends, we have thousands of friends in this incredible movement.This was a movement like no nobodys ever seen before, and frankly this was I believe the…

失落的Apache JDBM(Java Database Management)

简介 Apache JDBM&#xff08;Java Database Management&#xff09;是一个轻量级的、基于 Java 的嵌入式数据库管理系统。它主要用于在 Java 应用程序中存储和管理数据。这个项目已经过时了&#xff0c;只是发表一下以示纪念&#xff0c;现在已经大多数被SQLite和Derby代替。…

【STK学习】part2-星座-目标可见性与覆盖性分析

【Satellite Tool Kit】学习并深入了解卫星/星座生成、可见性分析、覆盖性分析等知识&#xff0c;并基于STK软件实现对应数据的导出&#xff0c;以用于算法的约束输入。 文章目录 一、学习目标二、学习内容2.1 星地可见性分析2.1.1 单星单地2.1.2 单星多地2.1.3 多星单地 2.2 星…

金融数据中心容灾“大咖说” | 美创科技赋能“灾备一体化”建设

中国人民银行发布的《金融数据中心容灾建设指引》&#xff08;JR/T 0264—2024&#xff09;已于2024年7月29日正式实施。这一金融行业标准对金融数据中心容灾建设中的“组织保障、需求分析、体系规划、建设要求、运维管理”进行了规范和指导。面对不断增加的各类网络、业务、应…

k8s篇之flannel网络模型详解

在 Kubernetes (K8s) 中,Flannel 是一种常用的网络插件,用于实现容器之间的网络通信。Flannel 提供了一种覆盖网络(Overlay Network)模型,使得容器可以跨多个主机进行通信。 以下是 Flannel 在 Kubernetes 中的详细工作原理和覆盖网络模型的详解: 1.Flannel 简介 Flann…

《第十部分》1.STM32之通信接口《精讲》之IIC通信---介绍

经过近一周的USART学习&#xff0c;我深刻体会到通信对单片机的重要性。它就像人类的手脚和大脑&#xff0c;只有掌握了通信技术&#xff0c;单片机才能与外界交互&#xff0c;展现出丰富多彩的功能&#xff0c;变得更加强大和实用。 单片机最基础的“语言”是二进制。可惜&am…

Vue通过file控件上传文件到Node服务器

功能&#xff1a; 1.多文件同时上传、2.拖动上传、3.实时上传进度条、4.中断上传和删除文件、5.原生file控件的美化 搁置的功能: 上传文件夹、大文件切片上传、以及其他限制条件未处理 Node服务器的前置准备: 新建文件夹: file_upload_serve初始化npm: npm …

【AI图像生成网站Golang】图床上传与图像生成API搭建

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 五、图床上传与图像生成API搭建 在项目中&#xff0c;我们通过整合 Go 和 FastAPI 实现了图像的上传和生成功能。本…

如何使用 Docker Compose 安装 WireGuard UI

简介 wireguard是什么&#xff1f;维基百科是这样描述的&#xff1a; WireGuard是一种实现加密虚拟专用网络(VPN) 的通信协议和免费开源软件&#xff0c;其设计目标是易于使用&#xff0c;高速性能和低攻击面。它旨在比IPsec和OpenVPN这两种常见的隧道协议具有更好的性能和更…