DAY 45 leetcode 28的kmp算法实现
KMP算法的思路
例:
文本串:a a b a a b a a f
模式串:a a b a a f
两个指针分别指向上下两串,当出现分歧时,并不将上下的都重新回退,而是利用“next数组”获取已经比较过的信息,上面的指针不动,而下面的回退到第n个
如:
i 指向b
文本串:a a b a a b a a f
模式串:a a b a a f
j<---- j 指向f
两者发生冲突,此时将j回退到模式串的第三个元素
然后重新开始同时前进,开始比对
next数组
可以注意到上述思路中最重要的是next数组,究竟如何求出next数组,为什么要回退到指定的位置
定义:next数组中,每个元素的值是,该模式串中对应下标的字符,所对应字符串(即从第一个元素到它自己)的最长相等前后缀的长度。
前后缀
前缀,不包含最后一个字符的所有子串;
后缀,不包含第一个字符的所有子串
如模式串 a a b a a f
next[0]=0;
next[1]=1; //aa这个字符串,对应的前缀为a 后缀为a 相等,且长度为1
next[2]=0; //aab前缀为 a,aa;后缀为ab,b,没有相等的,则为0
next[3]=1; //aaba前缀为 a,aa,aab;后缀为aba,ba,a, a==a,长度为1
next[4]=2; //aabaa前缀为 a,aa,aab,aaba;后缀为abaa,baa,aa,a, aa==aa, 长度为2
next[5]=0; //aabaaf前缀为a,aa,aab,aaba,aabaa;后缀为abaaf,baaf,aaf,af,f, 没有相等的,为0
如何移动j指针 以及为什么
依然拿这个举例:
i 指向b
文本串:a a b a a b a a f
模式串:a a b a a f
next数组:0 1 0 1 2 0
j<---- j 指向f
当两者发生冲突时,我们希望重新比较的次数越少越好,所以需要寻找以及匹配过的字符串,我们将j回退到第next[j-1]个数(即j的前一个)。
为什么呢?
直到f和b才不相同,也就是说之前的都是一一对应的,那么我们将模式串整体移动多少格能“不浪费”已经比对过的结果呢?就是next[j-i]。因为next数组中记录的是最长公共前后缀的长度,而next[j-i]等于2说明,f的前两个和从零开始的头两个字符是完全相等的,而已经说过“一一对应”,说明f的前两个和文本串的此时i指针的前两个是完全相等的,那么可以省去这两步的比较,将j回退到第三个,再开始比较。
求next数组的代码实现
public static int[] getNext(String s) {int[] arr = new int[s.length()];arr[0] = 0;int j = 0;for (int i = 1; i < arr.length; i++) {//如果j和i对应字符不相等,那么将j移动到arr[j-1]的位置while (j > 0 && s.charAt(j) != s.charAt(i)) {j = arr[j - 1];}//如果相同,j先往前移动一格,再将arr[i]赋值if (s.charAt(j) == s.charAt(i)) {j++;arr[i] = j;}}return arr;}
j有两个作用,一个是在数组中代表最长公共前后缀长度,另一个则是指示位置。
如当s.charAt(j) == s.charAt(i)时,意味着第i处的公共前后缀长度还可以加1,则此时将j自增后赋值给arr[i],同时还将j往前移动了一格
KMP的代码实现
class Solution {public int strStr(String haystack, String needle){int[] next=getNext(needle);if (needle.length() == 0) {return 0; // 如果needle为空字符串,根据定义返回0}//i指向文本串int j=0; //指向模式串for (int i = 0; i < haystack.length(); i++) {while (j > 0 && needle.charAt(j) != haystack.charAt(i)) j = next[j - 1];//不等则一直移动j指针if (needle.charAt(j) == haystack.charAt(i)) j++;if (j == needle.length()) return i - needle.length() + 1;}return -1;}//反转指定位置的函数public static int[] getNext(String s) {int[] arr = new int[s.length()];arr[0] = 0;int j = 0;for (int i = 1; i < arr.length; i++) {//如果j和i对应字符不相等,那么将j移动到arr[j-1]的位置while (j > 0 && s.charAt(j) != s.charAt(i)) {j = arr[j - 1];}//如果相同if (s.charAt(j) == s.charAt(i)) {j++;arr[i] = j;}}return arr;}}相关文章:
DAY 45 leetcode 28的kmp算法实现
KMP算法的思路 例: 文本串:a a b a a b a a f 模式串:a a b a a f 两个指针分别指向上下两串,当出现分歧时,并不将上下的都重新回退,而是利用“next数组”获取已经比较过的信息,上面的指针不…...
从代码学习深度学习 - 自注意力和位置编码 PyTorch 版
这里写自定义目录标题 前言一、自注意力:Transformer 的核心1.1 多头注意力机制的实现1.2 缩放点积注意力1.3 掩码和序列处理1.4 自注意力示例二、位置编码:为序列添加位置信息2.1 位置编码的实现2.2 可视化位置编码总结前言 深度学习近年来在自然语言处理、计算机视觉等领域…...
设计和实现一个基于 DDS(直接数字频率合成) 的波形发生器
设计和实现一个基于 DDS(直接数字频率合成) 的波形发生器 1. 学习和理解IP软核和DDS 关于 IP 核的使用方法 IP 核:在 FPGA 设计中,IP 核(Intellectual Property Core)是由硬件描述语言(HDL&a…...
AWS IAM权限详解:10个关键权限及其安全影响
1. 引言 在AWS (Amazon Web Services) 环境中,Identity and Access Management (IAM) 是确保云资源安全的核心组件。本文将详细解析10个关键的IAM权限,这些权限对AWS的权限管理至关重要,同时也可能被用于权限提升攻击。深入理解这些权限对于加强AWS环境的安全性至关重要。 2.…...
UniRig ,清华联合 VAST 开源的通用自动骨骼绑定框架
UniRig是清华大学计算机系与VAST联合开发的前沿自动骨骼绑定框架,专为处理复杂且多样化的3D模型而设计。基于强大的自回归模型和骨骼点交叉注意力机制,UniRig能够生成高质量的骨骼结构和精确的蒙皮权重,大幅提升动画制作的效率和质量。 UniR…...
DELL电脑开机进入自检界面
疑难解答 - 如何解决开机直接进入BIOS画面 添加链接描述 一、DELL电脑开机自检提示please run setup program 未设置一天中的时间-请运行安装程序(Time-of-day not set - please run SETUP program) 配置信息无效-请运行安装程序(Invalid configuration information - ple…...
分库分表-除了hash分片还有别的吗?
在分库分表的设计中,除了常见的 Hash 分片,还有多种策略根据业务场景灵活选择。以下是几种主流的分库分表策略及其应用场景、技术实现和优缺点分析,结合项目经验(如标易行投标服务平台的高并发场景)进行说明: 一、常见分库分表策略 1. 范围分片(Range Sharding) 原理:…...
Spring Cloud初探之使用load balance包做负载均衡(三)
一、背景说明 基于前一篇文章《Spring Cloud初探之nacos服务注册管理(二)》,我们已经将服务注册到nacos。接下来继续分析如何用Spring cloud的load balance做负载均衡。 load balance是客户端负载均衡组件。本质是调用方拿到所有注册的服务实例列表,然…...
MySQL 数据库备份和恢复全指南
MySQL 是一款常用的开源数据库系统,在日常运维中,数据备份和恢复是系统管理的重要一环。本文将细致介绍 MySQL 两大备份方案—— mysqldump 和 XtraBackup,包括备份方式、恢复步骤、定时脚本、远程备份和常见问题处理方案。 一、mysqldump 备…...
Linux 命令全解析:从零开始掌握 Linux 命令行
Linux 作为一款强大的开源操作系统,广泛应用于服务器、嵌入式系统以及超级计算机领域。掌握 Linux 命令行技能,是每一位开发者和系统管理员的必备能力。本文将从基础开始,为你详细介绍常用的 Linux 命令,以及它们的使用场景和示例…...
vector常用的接口和底层
一.vector的构造函数 我们都是只讲常用的。 这四个都是比较常用的。 第一个简单来看就是无参构造,是通过一个无参的对象来对我们的对象进行初始化的,第一个我们常用来当无参构造来使用。 第二个我们常用的就是通过多个相同的数字来初始化一个vector。 像…...
VMware安装Ubuntu实战分享
1.前期准备 1. 硬件要求 确保您的计算机满足以下基本硬件要求,以便顺利运行 VMware 和 Ubuntu: 处理器: 至少支持虚拟化技术(如 Intel VT-x 或 AMD-V)。可以在 BIOS 设置中启用此功能。 内存: 至少 4GB …...
解锁Grok-3的极致潜能:高阶应用与创新实践
引言 Grok-3,作为xAI公司推出的第三代人工智能模型,以其强大的推理能力和多模态处理能力在全球AI领域掀起了热潮。不仅在数学、科学和编程等基准测试中超越了众多主流模型,其独特的DeepSearch和Big Brain模式更赋予了它处理复杂任务的卓越性…...
【2025年3月中科院1区SCI】Rating entropy等级熵及5种多尺度,特征提取、故障诊断新方法!
引言 2025年3月,研究者在国际机械领域顶级期刊《Mechanical Systems and Signal Processing》(JCR 1区,中科院1区 Top,IF:7.9)上以“Rating entropy and its multivariate version”为题发表科学研究成果。…...
【AI学习】李宏毅老师讲AI Agent摘要
在b站听了李宏毅2025最新的AI Agent教程,简单易懂,而且紧跟发展,有大量最新的研究进展。 教程中引用了大量论文,为了方便将来阅读相关论文,进一步深入理解,做了截屏纪录。 同时也做一下分享。 根据经验调整…...
Nacos-Controller 2.0:使用 Nacos 高效管理你的 K8s 配置
作者:濯光、翼严 Kubernetes 配置管理的局限 目前,在 Kubernetes 集群中,配置管理主要通过 ConfigMap 和 Secret 来实现。这两种资源允许用户将配置信息通过环境变量或者文件等方式,注入到 Pod 中。尽管 Kubernetes 提供了这些强…...
小程序获取用户总结(全)
获取方式 目前小程序获取用户一共有3中(自己接触到的),但由于这个API一直在改,所以不确定后期是否有变动,还是要多关注官方公告。 方式一 使用wx.getUserInfo 实例: wxml 文件<button open-type="getUserInfo" bindgetuserinfo="onGetUserInfo&quo…...
SQL(2):SQL条件判断、排序、插入、更新、删除
1、满足条件 AND和OR,简单 SELECT * FROM 表 WHERE countryCN AND alexa > 50;SELECT * FROM Websites WHERE countryUSA OR countryCN;2、排序,掌握:<order by,降序怎么表示> 就没问题 默认升序,ASC表示升…...
玩转Docker | 使用Docker部署Xnote笔记工具
玩转Docker | 使用Docker部署Xnote笔记工具 前言一、Xnote介绍Xnote简介1.2 Xnote特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Xnote服务下载镜像编辑配置文件编辑部署文件创建容器检查容器状态检查服务端口安全设置四、访问Xnote服务访问Xnote首页…...
RPCRT4!OsfCreateRpcAddress函数分析之AssociationBucketMutexMemory数组的填充
第一部分: 1: kd> p RPCRT4!OsfCreateRpcAddress0x28: 001b:77c0f4f5 e888e5ffff call RPCRT4!OSF_ADDRESS::OSF_ADDRESS (77c0da82) 1: kd> t RPCRT4!OSF_ADDRESS::OSF_ADDRESS: 001b:77c0da82 ?? ??? 1: kd> kc # 00 RPCRT4!…...
【BUG】Redis RDB快照持久化及写操作禁止问题排查与解决
1 问题描述 在使用Redis 的过程中,遇到如下报错,错误信息是 “MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk...”,记录下问题排查过程。 2 问题排查与解决 该错误提示表明&#…...
conda如何安装和运行jupyter
在Conda环境中安装和运行Jupyter Notebook是一项常见且实用的任务,特别是在数据科学和机器学习项目中。以下是使用Conda安装和运行Jupyter Notebook的步骤: 安装Jupyter Notebook 首先,确保你的Conda是最新的。打开终端或Anaconda Prompt&a…...
java分页实例
引言 在现代Web应用和移动应用中,面对大量数据的展示,分页技术成为了提升用户体验和优化数据加载效率的关键手段。尤其是在MySQL数据库环境中,合理运用分页查询不仅能显著减少服务器负载,还能提升数据访问速度,为用户提…...
android 实现头像堆叠效果
1:依赖 implementation ("com.github.bumptech.glide:glide:4.12.0") annotationProcessor ("com.github.bumptech.glide:compiler:4.12.0") 第一种方式,布局创建frameLayout使用动态添加view方式实现 <FrameLayout and…...
【Linux篇】ELF文件及其加载与动态链接机制
ELF文件及其加载与动态链接机制 一. EFL文件1.1 ELF文件结构二. ELF文件形成与加载2.1 ELF形成可执行2.2 ELF控制性文件的加载2.2.1总结 三. ELF加载与进程地址空间3.1 动态链接与动态库加载3.1.1 进程如何看到动态库 3.2 全局偏移量表GOT(global offset table)3.2.…...
经典算法 判断一个图中是否有环
判断一个图中是否有环 问题描述 给一个以0 0结尾的整数对列表,除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图中是否存在环。存在输出YES,不存在输出NO。 输入样例1 6 8 5 3 …...
AI与深度伪造技术:如何识别和防范AI生成的假视频和假音频?
引言:深度伪造的崛起 近年来,人工智能技术迅猛发展,其中深度伪造(Deepfake) 技术尤为引人注目。这项技术利用深度学习和神经网络,可以轻松生成高度逼真的假视频和假音频,使人物的面部表情、语音…...
静态站点生成
以下是关于 静态站点生成(SSG) 的系统知识梳理,涵盖核心概念、核心实现、数据管理与优化等内容: 一、核心概念与优势 定义 静态站点生成(SSG)是在构建阶段预生成所有静态HTML文件的技术,用户访问时直接获取预渲染内容,无需服务器动态生成。 核心优势 性能卓越:CDN缓存…...
ESP32驱动读取ADXL345三轴加速度传感器实时数据
ESP32读取ADXL345三轴加速度传感器实时数据 ADXL345三轴加速度传感器简介ADXL345模块原理图与引脚说明ESP32读取ADXL345程序实验结果 ADXL345三轴加速度传感器简介 ADXL345是一款由Analog Devices公司推出的三轴数字加速度计,分辨率高(13位),测量范围达…...
【Linux】系统入门
【Linux】系统初识 起源开源 闭源版本内核内核编号 Linux的安装双系统(不推荐)WindowsLinuxvmware虚拟机vitualbox操作系统的镜像centos 7/ubuntu云服务器租用 Linux的操作lsmkdir 文件名pwdadduser userdel -rrm文件名cat /proc/cpuinfolinux支持编程vim code.c./a.out 运行程…...
