Java十大经典算法—KMP

字符串匹配问题:

1.暴力匹配

public class ViolenceMatch {public static void main(String[] args) {String str1 = "硅硅谷 尚硅谷你尚硅 尚硅谷你尚硅谷你尚硅你好";String str2 = "尚硅谷你尚硅你好";int index = violenceMatch(str1, str2);System.out.println("index=" + index);}//暴力匹配算法public static int violenceMatch(String str1, String str2) {char[] s1 = str1.toCharArray();char[] s2 = str2.toCharArray();int s1Len =s1.length;int s2Len =s2.length;int i = 0;//i索引指向s1int j = 0;//j索引指向s2while (i < s1Len && j < s2Len) {if (s1[i] == s2[j]) {i++;j++;}else {//如果匹配指令失败,令i=i-(j-1)【向后移一位】,j=0i=i-(j-1);j=0;}}if (j == s2Len) {return i-j;}else {return -1;}}
}

2.KMP算法 

概念

Knuth-Morris-Pratt 字符串查找算法,简称为 “KMP 算法”,常用于在一个文本串 S 内查找一个模式串 P 的出现位置,这个算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人于 1977 年联合发表,故取这 3 人的姓氏命名此算法.

KMP 方法算法就利用之前判断过信息,通过一个 next 数组,保存模式串中前后最长公共子序列的长度,每次回溯时,通过 next 数组找到,前面匹配过的位置,省去了大量的计算时间

key:next数组、KMP搜索🔍

流程与关键图解

流程图解
关键图解——匹配表
代码(核心点待理解)
import java.util.Arrays;public class KMP {public static void main(String[] args) {int[]next = kmpNext("ABCDABD");System.out.println("next"+ Arrays.toString(next));}/**** @param str1 源字符串* @param str2 子串* @param next 部分匹配值表* @return 如果是-1 就是没有匹配到,否则返回第一个匹配的位置*/public static int kmpSearch(String str1,String str2,int[]next){//遍历for (int i = 0,j=0; i < str1.length(); i++) {//需要处理 str1.charAt(i) != str2.charAt(j), 去调整 j 的大小//KMP 算法核心点, 可以验证..while(j>0&&str1.charAt(i)!=str2.charAt(j)){j=next[j-1];}if (str1.charAt(i)==str2.charAt(j)){j++;}if (j==str2.length()){return i-j+1;}}return -1;}//获取字符串的部分匹配值表public static int[] kmpNext(String dest){//创建一个next数组保存部分匹配值int[]next=new int[dest.length()];next[0]=0;//如果匹配字符串长度位1,部分匹配值就为0for (int i = 1,j=0; i <dest.length(); i++) {//当 dest.charAt(i) != dest.charAt(j) ,我们需要从 next[j-1]获取新的 j//直到我们发现 有 dest.charAt(i) == dest.charAt(j)成立才退出//这时 kmp 算法的核心点while (j>0&&dest.charAt(i)!=dest.charAt(j)){j=next[j-1];//???}//当 dest.charAt(i) == dest.charAt(j) 满足时,部分匹配值就是+1if (dest.charAt(i)==dest.charAt(j)){j++;}next[i]=j;}return next;}}

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

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

相关文章

力扣_数组29—根据前序与中序遍历序列构建二叉树、根据中序与后序遍历序列构建二叉树

题目 给定两个整数数组 p r e o r d e r preorder preorder 和 i n o r d e r inorder inorder &#xff0c;其中 p r e o r d e r preorder preorder 是二叉树的先序遍历&#xff0c; i n o r d e r inorder inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回…

数模学习day11-系统聚类法

本文参考辽宁石油化工大学于晶贤教授的演示文档聚类分析之系统聚类法及其SPSS实现。 目录 1.样品与样品间的距离 2.指标和指标间的“距离” 相关系数 夹角余弦 3.类与类间的距离 &#xff08;1&#xff09;类间距离 &#xff08;2&#xff09;类间距离定义方式 1.最短…

数据科学竞赛平台推荐

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

【PaperReading】4. TAP

Category Content 论文题目 Tokenize Anything via Prompting 作者 Ting Pan, Lulu Tang, Xinlong Wang, Shiguang Shan (Beijing Academy of Artificial Intelligence) 发表年份 2023 摘要 提出了一个统一的可提示模型&#xff0c;能够同时对任何事物进行分割、识别和…

机器学习_实战框架

文章目录 介绍机器学习的实战框架1.定义问题2.收集数据和预处理(1).收集数据(2).数据可视化(3).数据清洗(4).特征工程(5).构建特征集和标签集(6).拆分训练集、验证集和测试集。 3.选择算法并建立模型4.训练模型5.模型的评估和优化 介绍机器学习的实战框架 一个机器学习项目从开…

在加载第三方库过程中,无法加载到库的问题(使用readelf, patchelf命令)

无法加载到库问题 问题及分析过程readelf 命令patchelf命令 问题及分析过程 在开发一个程序过程中&#xff0c;需要加载第三方库iTapTradeAPI, 在CMakeList.txt中已经设置了CMAKE_INSTALL_RPATH&#xff0c;但是发布到生产之后由于目录问题无法加载到libiTapTradeAPI库了 下面…

一篇文章带你了解Python常用自动化测试框架——Pytest!

在之前的文章里我们已经学习了Python自带测试框架UnitTest&#xff0c;但是UnitTest具有一定的局限性 这篇文章里我们来学习第三方框架Pytest&#xff0c;它在保留了UnitTest框架语法的基础上有着更多的优化处理 下面我们将从以下角度来介绍Pytest&#xff1a; Pytest基本介…

pyhackrf 发送写法重点 一定要这样写才能发送

非常抱歉误导了大家 以前的写法会让波形不正常 但我已经写出正确方式了 大家参考: import pyhackrf2 as pyhackrf import numpy as np import ook as ook from multiprocessing import Array import threadingbuffer [0xff,0x09]raw ook.tx_data(buffer)class hackrf_thre…

Docker的基础概念及命令

这篇主要介绍一下Docker比较重要的两个概念&#xff0c;镜像和容器&#xff0c;以及操作它们的一些常用命令。 文章目录 一、基础命令二、镜像三、容器 一、基础命令 docker -v&#xff1a;查看 Docker 的版本 systemctl start docker&#xff1a;启动docker systemctl stat…

JavaScript中这些事件(event)类型你都知道吗?

JavaScript中有许多不同类型的事件&#xff0c;用于监听和响应Web页面上的各种交互和用户动作。以下是一些常见的JavaScript事件类型&#xff1a; 鼠标事件&#xff1a; click: 鼠标点击元素时触发。mouseover 和 mouseout: 鼠标进入和离开元素时触发。mousedown 和 mouseup: 鼠…

x-cmd pkg | ctop - 针对容器的类 top 命令

目录 介绍首次用户功能特点类似工具与竞品进一步阅读 介绍 ctop 是一个基于容器的类似 top 命令的性能监控工具&#xff0c;采用 Go 语言编写的&#xff0c;它以类似于 top 命令的方式显示运行中的容器的资源使用情况。ctop 提供了一个交互式的界面&#xff0c;可以让用户实时…

ensp配置命令大全

以下是一些常见的ensp配置命令&#xff1a; 配置接口&#xff1a; interface <interface-name>&#xff1a;进入接口配置模式ip address <ip-address> <subnet-mask>&#xff1a;配置接口IP地址和子网掩码shutdown&#xff1a;禁用接口no shutdown&#xff1…

fo安方的个人、博客和专栏

&#x1f49d;&#x1f49d;各位领导好&#xff0c;欢迎光临&#x1f49d;&#x1f49d; ☁️☁️slogon&#xff1a;云想衣裳花想容&#xff0c;春风扶栏露华容☁️☁️ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;fo安方的博客&#x1f4a5;&#x1f4a5; &#x1f49e;…

CRLF漏洞靶场记录

搭建 利用 docker 搭建 vulhub 靶场 git clone https://github.com/vulhub/vulhub.git 进入 /vulhub/nginx/insecure-configuration 目录 启动前关闭现有的 8080、8081、8082 端口服务&#xff0c;避免端口占用 docker-compose up -d 进入容器 docker exec -it insecure-…

Jmeter接口自动化02--JMeter的安装和使用

p02 高清B站视频链接 2.1 Windows环境 首先需要安装JDK&#xff0c;然后再部署JMeter。注意&#xff0c;JMeter对JDK的版本是有要求的&#xff0c;一般至少要JDK8&#xff0c;这也是目前开发过程中使用频繁的版本。 1. 安装JDK 从官网下载JDK&#xff1a;https://www.oracl…

QT:使用QStyle实现QMenu的滚动效果

项目中&#xff0c;使用QMenu&#xff0c;多个QAction时 超出页面范围&#xff0c;需要菜单栏可以上下滚动。 实际QMenu是带滚动的&#xff0c;但是要知道怎么使用 还是需要查看QT源码&#xff0c;现在简单记录下我的使用方法。 QT源码中&#xff1a;q->style()->style…

Java人脸识别

Java人脸识别 一.提出问题&#xff0c;引入SDK的概念 什么是SDK&#xff1f; 我们并不具备开发人脸识别的能力&#xff0c;但我们可以用大公司已经开发好的工具或者功能&#xff0c;来实现人脸识别&#xff0c;而大公司提供的就叫SDK(Software Development Kit)软件开发工具包…

扫雷(c语言)

先开一个test.c文件用来游戏的逻辑测试&#xff0c;在分别开一个game.c文件和game.h头文件用来实现游戏的逻辑 主要步骤&#xff1a; 游戏规则&#xff1a; 输入1&#xff08;0&#xff09;开始&#xff08;结束&#xff09;游戏&#xff0c;输入一个坐标&#xff0c;如果该坐…

制作文件二维码有什么好处?多个文件通过一个二维码展示的方法

现在把文件做成二维码来使用是很常见的一种方式&#xff0c;那么为什么很多人会选择这种方式来分享文件呢&#xff1f;那么用文件二维码有哪些好处呢&#xff1f;下面就让小编来给大家讲解一下。 首先&#xff0c;将文件制作二维码有利于多人同时查看内容&#xff0c;方便文件…

开抖音小店最低的成本是多少?运营带你揭秘!

大家好&#xff0c;我是电商糖果 一个做了7年电商的90后&#xff0c;从2020年开始做抖音小店。 所以关于抖音小店开店成本还是比较了解的&#xff0c;这里糖果就来给大家揭秘一下。 其实它总共分为两部分&#xff0c;第一部分就是开店成本&#xff0c;第二部分就是店铺运营成…