左神算法基础提升--3

文章目录

  • Manacher 算法
    • 经典算法
    • Manacher算法原理
  • 单调栈或单调队列


Manacher 算法

经典算法

在这里插入图片描述
在每学习Manacher算法之前我们可能会使用一种比较经典暴力的算法:遍历str字符串,将字符串中的每个字符作为对称点,向两边扩散找到回文字段,并与最长进行比较,直到找到最长回文子串。
但这种算法有一个问题:他无法找到偶数的回文子串,因为偶数回文子串的对称轴不在字符串中,而是一条虚线。
为了解决这个问题,我们需要采用填补的方法将原字符串通过使用某一种特定的字符填补。
在这里插入图片描述
通过这种方法便能够找到填补后的字符串的最长回文子串的长度,再将字符串中每个节点长度除以2便能找到原字符串中最长回文子串的长度。
需要注意的是,填补的字符可以是任意的甚至是原字符串中出现都没关系,都能找到正确的结果、
这种方法虽然能够找到正确的答案,但是其所需时间较长。其时间复杂度为O(n^2).

Manacher算法原理

Manacher算法和KMP算法类似,均是找到其内部的数学规律,借助其他的数据结构减少重复计算。
在学习Manacher算法前我们需要了解两个定义:1.回文半径数组;2.最右回文右边界;
回文半径数组是指:找到填补后的字符串的每一个字符为中心的回文半径。
最有回文右边界是指:找到的属于回文的最右的右边界。
在这里插入图片描述
在了解上面的概念后,边可以使用Manacher算法进行优化了。
对算法进行优化主要分为种情况:
1.选定为中心的字符在最右回文右边界的左边;
在这种情况下,与前文提到的暴力方法相同,直接暴力扩展。
2.选定为中心的字符在最右回文右边界里;这种情况又分为两种
①该点与最右回文右边界的对称点对称的点所在的回文半径数值小于该点到最右回文右边界的距离;
在这里插入图片描述
此时该点的最长回文子串长度与其对称点长度相同。
②该点与最右回文右边界的对称点对称的点所在的回文半径数值大于该点到最右回文右边界的距离;
在这里插入图片描述
此时该点的最长回文子串长度为该点到最右回文右边界的距离。
③该点与最右回文右边界的对称点对称的点所在的回文半径数值恰好恰好等于该点到最右回文右边界的距离;
在这里插入图片描述
在这种情况下,我们需要接着进行尝试,看看该点能不能找到一个更大的最长回文子串。
完整代码
在这里插入图片描述
在这里插入图片描述

单调栈或单调队列

在这里插入图片描述
在求解这道题时,我们可以使用双端队列进行求解,我们在双端队列中维持一个单调性,按从大到小的顺序依次将窗口内的下。在窗口往右移动的时候,依旧保持这个单调性,并将新加入的数组中的数的下标从尾部加入双端队列中;
在窗口往左移动的时候,判断当前是否已经移动过了双端队列内的下标,如果移动过了即双端队列中的下标有些已经不在窗口内了,便将他们从头部弹出。
在这里插入图片描述
这个双端队列实际上存放的是窗口以此往右移动依次过期的最大值。
代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
对于这道题,我们需要使用单调栈实现。
我们先创建一个栈,并在栈中维持好从小到大的单调性。依次将数组中的数加入到栈中,如果一个数加入后会破坏其单调性,我们便需要将其弹出,同时使其弹出的数便是从右离这个数最近且比这个数小的数,其在栈中的下个数便是比该数小且左边离该数最近的数。
在这里插入图片描述

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

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

相关文章

【Docker】使用Dev Container进行开发

工作区 Dev Container 设置 新建一个文件夹 ./devcontainer 然后下面放 devcontainer.json 然后安装 vscode dev container 插件,然后 CtrlShiftP 启动 Container {"name": "PyTorch-Julia Development","image": "x66ccff/p…

浅谈操作系统与初识Linux

一、Linux操作系统的出现 1.1操作系统的出现以及相关的四个要素 1.2最早出现的操作系统及其创始人 起初,IBM为了让计算机可以以更低技术成本进行使用,以此来售卖计算机; 为计算机搭载上了Unix操作系统,Unix由肯汤普森用汇编语…

ElasticSearch下

DSL查询 叶子查询:在特定字段里查询特定值,属于简单查询,很少单独使用复合查询:以逻辑方式组合多个叶子查询或更改叶子查询的行为方式 在查询后还可以对查询结果做处理: 排序:按照1个或多个字段做排序分页…

牛客----mysql

查找除复旦大学的用户信息_牛客题霸_牛客网 题目:现在运营想要查看除复旦大学以外的所有用户明细包括的字段有 device_id、gender、age、university,请你取出相应数据 示例:user_profile iddevice_idgenderageuniversityprovince12138male…

Android SystemUI——CarSystemBar车载状态栏(九)

上一篇文章我们介绍了车载开发中的 CarSystemUI,而车载开发中的状态栏也被 CarSystemBar 所取代,这里我们就来看看一下车载系统中的状态栏——CarSystemBar。 一、车载状态栏创建 1、CarSystemBar 源码位置:/packages/apps/Car/SystemUI/src/com/android/systemui/car/sy…

java根据模板导出word,并在word中插入echarts相关统计图片以及表格

引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题,需要处理将ftl文件中的图片的Base64删除,并使用占位符代替插入表格,并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…

链式前向星的写法

【图论02】动画说图的三种保存方式 降低理解门槛 邻接表 链式前向星 邻接矩阵_哔哩哔哩_bilibili 杭电ACM刘老师-算法入门培训-第12讲-拓扑排序及链式前向星_哔哩哔哩_bilibili 图论003链式前向星_哔哩哔哩_bilibili(链式前向星的遍历) head数组的下标…

Trie(算法版)

#include <iostream>using namespace std;const int N100010; int son[N][26],cnt[N],idx; //son记录trie数&#xff0c;cnt记录每个词出现的次数&#xff0c;idx记录每个字符所占⽤的下标//加入字符串 void add(char str[]){//idx 0既表⽰根节点也表⽰空节点int p 0;fo…

软件工程导论

第 1 章 软件工程学概述&#xff1a;介绍了软件危机的表现、产生原因及消除途径&#xff0c;阐述了软件工程的定义、基本原理和方法学&#xff0c;还讲解了软件生命周期和软件过程的相关概念&#xff0c;包括瀑布模型、快速原型模型等多种软件开发模型当当。第 2-8 章 软件生命…

想品客老师的第一天:值类型使用

前面两章的摘要 ECMAscript&#xff08;也就是ES&#xff09;是JavaScript的一个标准&#xff0c;就像c的c11和c99一样&#xff0c;几把的一年出一套标准 freeze()是一个对象方法&#xff0c;表示锁定、固定一个对象不可改变&#xff08;因为const对于标量不可变&#xff0c;…

容器渗透横向

本质上要获得 1.获得容器IP段 2.获得主机IP段 3.获得本机IP 4.通过CNI或Docker0等扫描本机端口 Flannel 容器信息 rootubuntu-linux-22-04-desktop:/home/parallels/Desktop# k get po -A -o wide NAMESPACE NAME …

贪心算法(题1)区间选点

输出 2 #include <iostream> #include<algorithm>using namespace std;const int N 100010 ;int n; struct Range {int l,r;bool operator <(const Range &W)const{return r<W.r;} }range[N];int main() {scanf("%d",&n);for(int i0;i&l…

解决本地运行MR程序访问权限问题

文章目录 1. 提出问题2. 解决问题2.1 临时解决方案2.2 永久解决方案 3. 小结 1. 提出问题 运行DeduplicateIPsDriver类&#xff0c;抛出如下异常&#xff1a; 该错误信息表明在尝试运行 DeduplicateIPsDriver 类时&#xff0c;遇到了 HDFS&#xff08;Hadoop 分布式文件系统&a…

【学习总结|DAY032】后端Web实战:登录认证

在 Web 后端开发中&#xff0c;登录认证是保障系统安全和用户数据隐私的关键环节。本文将结合实际开发案例&#xff0c;深入探讨登录功能与登录校验的实现思路和技术细节&#xff0c;希望能帮助读者更好地掌握这一重要知识点。 一、登录功能实现 1.1 思路分析 登录功能的核心…

html全局遮罩,通过websocket来实现实时发布公告

1.index.html代码示例 <div id"websocket" style"display:none;position: absolute;color:red;background-color: black;width: 100%;height: 100%;z-index: 100; opacity: 0.9; padding-top: 30%;padding-left: 30%; padding-border:1px; "onclick&q…

sqlmap使用手册

sqlmap使用手册 一、sqlmap简介二、sqlmap常用命令三、sqlmap使用示例四、注意事项sqlmap使用手册 sqlmap是一个开源的渗透测试工具,主要用于自动检测和利用SQL注入漏洞来接管数据库服务器。以下是对sqlmap的详细介绍和使用指南: 一、sqlmap简介 sqlmap具有强大的检测引擎和…

高通8255 Android STR 启动失败要因分析调查

目录 背景&#xff1a; 调查过程&#xff1a; 步骤1&#xff1a; slog2info | grep vmm_service 步骤2&#xff1a; slog2info | grep qvm 总结&#xff1a; 解决方案 背景&#xff1a; 调试高通8255 STR的STR过程中发现Android和QNX进入STR状态后&#xff0c;脱出STR时…

Linux UDP 编程详解

一、引言 在网络编程领域&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;作为一种轻量级的传输层协议&#xff0c;具有独特的优势和适用场景。与 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff0…

数据增强方法及其工具

数据增强&#xff08;Data Augmentation&#xff09;是指在训练深度学习模型时&#xff0c;通过对现有数据进行一系列变换&#xff0c;从而生成新的样本。数据增强有助于增加数据的多样性&#xff0c;减少过拟合&#xff0c;提升模型的泛化能力&#xff0c;尤其是在数据量有限的…

整数在计算机眼中是什么样子的呢?

整数类型 在现实世界中&#xff0c;整数是无穷的。但在计算机中&#xff0c;由于内存资源的有限性&#xff0c;我们只能表示有限范围的整数。 1. 整数类型的分类 在编程语言(如Java)中&#xff0c;整数类型主要分为以下几种&#xff1a; byte: 1个字节&#xff0c;范围[-12…