kpm算法

这里写自定义目录标题

  • 介绍
  • KMP算法的核心思想
  • KMP算法的步骤
  • 例题
    • 问题分析
    • 图解
    • 代码
    • 输出结果

介绍

  • KMP(Knuth-Morris-Pratt)算法是一种用于在一个文本串(text)中查找一个模式串(pattern)的高效字符串匹配算法。相比暴力破解法,KMP算法利用了模式串内部的信息,在匹配过程中避免重复比较已经比较过的字符,从而提高了匹配效率。

KMP算法的核心思想

  • 构建最长前缀后缀匹配表(lps数组):在KMP算法中,首先需要构建模式串的最长前缀后缀匹配表(也称为部分匹配表),通过这个表可以指导模式串在匹配过程中的移动。
  • 匹配过程:在匹配过程中,通过利用最长前缀后缀匹配表,可以避免在文本串中不必要的回溯,从而提高匹配效率。

KMP算法的步骤

  • 构建最长前缀后缀匹配表(lps数组):根据模式串的字符构建一个最长前缀后缀匹配表,表中每个位置记录着当前位置之前的最长相等前缀后缀的长度。
  • 在匹配过程中,根据文本串和模式串的字符进行比较,利用最长前缀后缀匹配表指导模式串的移动。
  • 当模式串完全匹配时,返回匹配的起始位置;否则,根据匹配失败时的情况对模式串进行移动,继续匹配。

KMP算法的时间复杂度为O(m+n),其中m为文本串的长度,n为模式串的长度。由于KMP算法充分利用了模式串内部的信息,在实际应用中具有较高的效率。

例题

问题分析

    1. 有一个字符串strl=“BBC ABCDAB ABCDABCDABDE”,和一个子串str2=“ABCDABD”
    1. 现在要判断 strl是否含有str2,如果存在,就返回第一次出现的位置,如果没有,则返回-1
    1. 要求:使用KMP算法完成判断,不能使用简单的暴力匹配算法

图解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

import java.util.Arrays;

public class kpm2 {
    public static void main(String[] args) {
        String s1 = "硅谷 尚硅谷你尚硅谷 尚硅谷你上硅谷你好啊";
        String s2 = "尚硅谷你尚硅";

        System.out.println(Arrays.toString(kpmNext(s2)));
        System.out.println(kpm(s1,s2,kpmNext(s2)));
    }

    private static int kpm(String s1 ,String s2 ,int[] arr){

        for (int i = 0 , j = 0; i < s1.length(); i++) {
            //移动s2,字符串的位置从而达到降循环次数
            if (j > 0 && s1.charAt(i) != s2.charAt(j)){
                j = arr[j - 1];
            }
            //要是相同就j++; 让判断的s2字符串向后移动
            if (s1.charAt(i) == s2.charAt(j)){
                j++;
            }
            if (j == s2.length()){//找到
                return i - j + 1;
            }
        }
        //没有找到
        return  -1;
    }
    
    //获得到一个字符串(字串)的部分匹配值表
    private static int[] kpmNext(String s2){
        int[] next = new int[s2.length()];
        next[0] = 0;

        for (int i = 1 , j = 0; i < s2.length() ; i++) {
            //kpm 核心代码 ,得出特殊情况下的j的值
            if (j > 0 && s2.charAt(i) != s2.charAt(j)){
                j = next[j - 1];
            }
            //只要相同就+1
            if (s2.charAt(i) == s2.charAt(j)){
                j ++;
            }
            //把j的数字放到next中
            next[i] = j;
            
        }
        return next;
        
    }
}

输出结果

[0, 0, 0, 0, 1, 2]
3

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于java的足球联赛管理系统(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

大数据与云计算

目录 一、大数据时代二、云计算——大数据的计算三、云计算发展现状四、云计算实现机制五、云计算压倒性的成本优势 一、大数据时代 我们先来看看百度关于 “大数据”&#xff08;Big Data&#xff09;的搜索指数。 可以看出&#xff0c;“大数据” 这个词是从2012年才引起关注…

趣学前端 | Taro迁移完成之后,总结了一些踩坑经验

背景 四月份的时候&#xff0c;尝试将老的移动端项目改造成多端。因为老项目使用的React框架&#xff0c;综合考量&#xff0c;保障当前业务开发的进度同时&#xff0c;进行项目迁移&#xff0c;所以最后选择了Taro框架。迁移成本会低一些&#xff0c;上手快一些。 上个月&am…

docker部署在线聊天室平台Fiora

Fiora 是一款开源免费的在线聊天系统 https://github.com/yinxin630/fiora 部署 创建docker网络 docker network create fiora-networkdocker-compose部署 vim docker-compose.yml version: 3 services:fiora_redis:image: rediscontainer_name: fiora_redisrestart: alway…

Linux 地址空间

目录 一、程序地址空间 1、虚拟地址 Makefile新写法 2、进程地址空间分布 3、栈&堆 4、static修饰局部变量 5、字符串常量不可修改 6、虚拟地址与物理地址的联系 二、CPU读取程序全过程 1、形成可执行程序 2、生成虚拟地址 3、程序的启动 4、创建进程 5、地…

11---数字温度 OR 湿度传感器电路设计

视频链接 数字温度or湿度传感器电路设计02_哔哩哔哩_bilibili 数字温度 OR 湿度传感器电路设计 1、温湿度传感器 DHT11 DHT11是一款有已校准数字信号输出的温湿度传感器。 其精度湿度-5%RH&#xff0c; 温度-2℃&#xff0c;量程湿度20-90%RH&#xff0c; 温度0~50℃。 D…

maven运行spring boot项目

我用idea想跑一个整合flowable的spring boot项目&#xff0c;但是跑不起来&#xff0c;原因是jdk版本不够高。但是我的idea是2018版本&#xff0c;最高只能支持到jdk11。就想办法不用idea编译、打包、运行项目。因为spring boot是maven项目&#xff0c;所以可以用maven进行打包…

纵行科技邀您相聚“2024全球物流技术大会”

3月27-29日&#xff0c;中国物流与采购联合将在海口召开“2024全球物流技术大会”&#xff0c;大会将全方位、多层次、立体化展现前沿物流技术的发展&#xff0c;加速前沿技术装备在物流行业的应用。作为供应链物流物联网技术及产品厂商的代表&#xff0c;纵行科技将携“ZETag云…

vite vue3 路由配置@找不到文件问题描述

问题描述 在vite.config.js文件中配置路由的时候&#xff0c;添加路由界面&#xff0c;找不到指定的文件&#xff0c;提示错误&#xff0c;如图所示&#xff1a; 但是换成 ./ 或者 ../ 就正常了&#xff0c;也没有报错问题 解决办法 1.安装一个path的插件 npm install --sav…

什么是Git引用和分支?

一. 引言 什么是Git引用和分支&#xff1f;比如我在 Github 上一个项目的 .git/refs目录下&#xff1a; ├─heads │ dev │ master │ ├─remotes │ └─origin │ master │ └─tags refs 目录下包含了 heads、remote、tags 三个子目录&#xff0…

300分钟吃透分布式缓存-22讲:怎么认识和应用Redis内部数据结构?

Redis 内部数据结构 RdeisDb Redis 中所有数据都保存在 DB 中&#xff0c;一个 Redis 默认最多支持 16 个 DB。Redis 中的每个 DB 都对应一个 redisDb 结构&#xff0c;即每个 Redis 实例&#xff0c;默认有 16 个 redisDb。用户访问时&#xff0c;默认使用的是 0 号 DB&…

【CSS】简单的抽屉面板展开收起自然过渡效果的css

目录 效果展示css固定梯形按钮至抽屉面板中间梯形按钮css过渡动画 效果展示 1.收起时点击蓝色梯形按钮展开 2. 展开时点击蓝色按钮收起 3.展开收起时需要过渡自然&#xff0c;有抽屉推拉效果 css 固定梯形按钮至抽屉面板中间 .toggle{ position: absolute;left:-21px;top…

【CSP】2022-03-3 计算资源调度器 stl大模拟使用map优化索引 完整思路+完整的写代码过程(遇到的问题)+完整代码

2022-03-3 计算资源调度器 stl大模拟使用map优化索引 2022-03-3 计算资源调度器 stl大模拟使用map优化索引思路写代码的过程&#xff08;遇到的问题&#xff09;完整代码 2022-03-3 计算资源调度器 stl大模拟使用map优化索引 在联系了之前那么多道stl大模拟题后&#xff0c;终…

Flutter does not exist

Flutter does not exist 原因&#xff1a;Generated.config 配置文件内路径缺失 原因&#xff1a;Flutter SDK缺失 通过配置文件查到Flutter SDK在本地的存放位置FLUTTER_FRAMEWORK_DIR/Users/haijunyan/Documents/flutter/bin/cache/artifacts/engine/ios 真机所需&#xf…

day06、07-MySQL

文章目录 一、MySQL概述1.1 安装1.2 数据模型1.3 SQL简介1.3.1 SQL通用语法1.3.2 分类 二. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创建数据库2.2.3 使用数据库2.2.4 删除数据库 2.3 图形化工具2.3.1 介绍2.3.2 安装2.3.3 使用2.2.3.1 连接数据库…

【数据结构与算法】贪心算法题解(一)

这里写目录标题 一、455. 分发饼干二、56. 合并区间三、53. 最大子数组和 一、455. 分发饼干 简单 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这…

五种常见户外LED显示屏模组故障维修方法

在户外LED显示屏的使用过程中&#xff0c;可能会出现各种故障&#xff0c;例如连续不亮、坏点等问题&#xff0c;这通常是由LED显示屏模组上出现问题所导致的。以下是针对五种常见户外LED显示屏模组故障的解决办法&#xff1a; 连续不亮或有异常&#xff1a; 这种情况通常导致L…

matlab去除图片上的噪声

本问题来自CSDN-问答板块,题主提问。 如何利用matlab去除图片上的噪声? 一、运行效果图 左边是原图,右边是去掉噪音后的图片。 二、中文说明 中值滤波是一种常见的图像处理技术,用于去除图像中的噪声。其原理如下: 1. 滤波器移动:中值滤波器是一个小的窗口,在图像上移…

包装类 --java学习笔记

包装类 包装类就是把基本类型的数据包装成对象 基本数据类型与其包装类&#xff1a; 将整型数据包装成对象&#xff1a; 自动装箱&#xff1a;可以自动把基本类型的数据转换成对象 例&#xff1a;Interger a3 12&#xff1b; 自动拆箱&#xff1a;可以自动把包装类型的对象…

地理数据可视化:使用echarts实现地图可视化功能

前言 地图是一种直观而强大的数据可视化工具&#xff0c;能够帮助我们更好地理解地理分布和区域间的差异。在本文中&#xff0c;我们将探讨如何使用 echarts 实现地图功能&#xff0c;展示各个区域的数据分布和趋势。 一、基础使用 <template><div class"chartB…