当前位置: 首页 > news >正文

manacher算法

Manacher 算法快速入门

Manacher 算法是一种用于寻找字符串中最长回文子串的高效算法,时间复杂度为 O(n)


基本概念

回文

回文是一个字符串,从左到右和从右到左读都一样。

示例

  • 回文:"aba""abba"
  • 非回文:"abc""abcd"

算法目标

给定字符串 s,找到其最长回文子串。

输入"babad"
输出"bab""aba"


算法思想

  1. 字符串预处理

    • 为了统一奇数和偶数长度的回文形式,插入分隔符 #
    • 例如:"babad""#b#a#b#a#d#"
  2. 维护变量

    • P[i]:记录以位置 i 为中心的回文半径。
    • C:当前回文的中心。
    • R:当前回文的右边界。
  3. 扩展回文并优化

    • 对每个字符尝试扩展,并利用对称性优化。
  4. 提取结果

    • 根据 P 数组找到最大值,从而还原最长回文子串。

详细步骤

Step 1: 字符串预处理

通过插入 #,将奇数和偶数回文统一。

原始字符串"babad"
预处理后"#b#a#b#a#d#"

Step 2: 遍历字符串并更新

初始化 P 数组,按以下规则遍历:

  1. 对称性优化
    • i 在右边界内:
      [
      P[i] = \min(P[\text{mirror}], R - i)
      ]
    • 对称点:mirror = 2C - i
  2. 尝试扩展
    • t[i + P[i] + 1] == t[i - P[i] - 1] 条件下,扩展 P[i]
  3. 更新中心和右边界
    • 如果扩展后的回文超出当前右边界,则更新 CR

Step 3: 提取最长回文

P 数组中找到最大值 P[i],其对应的中心点 i 即为最长回文的中心。

利用公式:
[
\text{start} = \frac{\text{中心索引} - \text{半径}}{2}
]
将索引映射回原字符串,提取子串。


其中最关键的是关于中心 C 这个对称点的理解

比如 #a#b#a#b#a#c#
#a#b#a 对应 为 0 1 0 3 0 5
这时候 因为 最后一个字符的半径最大 这时候 找下一个字符的时候, 中心点就是 长度为5 的这个a

之后后面查找的时候, 就可以知道, 这个半径内, 左右是一样的, 那就可以快速跳过重复的查找

在这里插入图片描述

在这里插入图片描述

C++ 实现代码

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>using namespace std;string manacher(const string &s) {// 步骤 1: 预处理字符串,在每个字符两侧插入分隔符('#')string t = "#";for (char c : s) {t += c;t += "#";}int n = t.size();vector<int> P(n, 0); // 数组 P 存储以每个位置为中心的回文半径int C = 0, R = 0;    // 当前回文的中心 C 和右边界 R// 步骤 2: 遍历预处理后的字符串for (int i = 0; i < n; ++i) {// i 关于中心 C 的对称点int mirror = 2 * C - i;// 如果 i 在当前回文右边界内,初始化 P[i]if (i < R) {P[i] = min(P[mirror], R - i);}// 尝试扩展以 i 为中心的回文while (i + P[i] + 1 < n && i - P[i] - 1 >= 0 && t[i + P[i] + 1] == t[i - P[i] - 1]) {++P[i];}// 如果回文扩展超出当前右边界,更新中心 C 和右边界 Rif (i + P[i] > R) {C = i;R = i + P[i];}}// 步骤 3: 找到 P 数组中最大值,确定最长回文int max_len = 0, center_index = 0;for (int i = 0; i < n; ++i) {if (P[i] > max_len) {max_len = P[i];center_index = i;}}// 步骤 4: 从原始字符串中提取最长回文子串int start = (center_index - max_len) / 2; // 将索引从预处理后的字符串转换回原始字符串return s.substr(start, max_len);
}int run() {string s;cin >> s;string longest_palindrome = manacher(s);cout << "最长回文子串: " << longest_palindrome << endl;return 0;
}int main() {// 如果在苹果或Windows系统上,重定向输入输出
#if defined(__APPLE__) || defined(__WIN32__ )freopen("./slyar.in", "r+", stdin); // 重定向标准输入到slyar.in文件freopen("./slyar.out", "w+", stdout); // 重定向标准输出到slyar.out文件
#endifrun(); // 调用运行主逻辑函数
}

相关文章:

manacher算法

Manacher 算法快速入门 Manacher 算法是一种用于寻找字符串中最长回文子串的高效算法&#xff0c;时间复杂度为 O(n)。 基本概念 回文 回文是一个字符串&#xff0c;从左到右和从右到左读都一样。 示例&#xff1a; 回文&#xff1a;"aba"、"abba"非回…...

Cocos2dx Lua绑定生成中间文件时参数类型与源码类型不匹配

这两天维护的一个项目&#xff0c;使用arm64-v8a指令集编译时遇到了报错&#xff0c;提示类型不匹配&#xff0c;具体报错的代码【脚本根据C源文件生成的中间文件】如下&#xff1a; const google::protobuf::RepeatedField<unsigned long long>& ret cobj->equi…...

为什么需要 std::call_once?

std::call_once 是 C 标准库中的一个函数&#xff0c;用来确保某个操作仅被执行一次&#xff0c;通常用于线程安全的初始化操作。它常与 std::once_flag 结合使用&#xff0c;后者用于标记某个操作是否已经执行过。 为什么需要 std::call_once&#xff1f; 在多线程程序中&am…...

ubuntu非root用户操作root权限问题-virbox挂在共享文件夹

首先讲一下&#xff0c;virtuallbox 挂在文件夹&#xff0c;操作的时候总是需要root权限&#xff0c;比较费劲。 这一操作其实也正对着我们在Ubuntu上的操作。 前段时间我想在ubuntu正常用户下去操作i2c&#xff0c;也出现了类似的问题。 后来把正常的操作加到组里面也解决了类…...

网络通讯协议

层次协议应用层HTTP, HTTPS, FTP, SMTP, POP3, IMAP, DNS, DHCP, SNMP, Telnet, SSH, SIP, RTP, RTCP, TFTP, NTP, ICMP, IGMP传输层TCP, UDP网络层IP, ICMP, IGMP数据链路层Ethernet, PPP, HDLC, ATM, Frame Relay ISO/OSI 参考模型协议应用层HTTP, HTTPS, FTP, SMTP, POP3, …...

centos,789使用mamba快速安装devtools

如何进入R语言运行环境请参考&#xff1a;Centos7_miniconda_devtools安装_R语言入门之R包的安装_r语言devtools包怎么安装-CSDN博客 在R里面使用安装devtools经常遇到依赖问题&#xff0c;排除过程过于费时&#xff0c;使用conda安装包等待时间长等。下面演示centos,789都是一…...

【人工智能机器学习基础篇】——深入详解强化学习之常用算法Q-Learning与策略梯度,掌握智能体与环境的交互机制

深入详解强化学习之常用算法&#xff1a;Q-Learning与策略梯度 强化学习&#xff08;Reinforcement Learning, RL&#xff09;作为机器学习的一个重要分支&#xff0c;近年来在多个领域取得了显著成果。从棋类游戏的人机对战到自主驾驶汽车&#xff0c;强化学习技术展示了其强大…...

银河麒麟桌面v10sp1修复引导笔记

1.安装双系统最好备份esp分区&#xff0c;uefi引导丢失可以用diskgen,选择工具再点击设置uefi bios&#xff0c;鼠标右键选择efi文件。 2.银河麒麟界面添加windows&#xff0c;复制EFI/Microsoft或者pe生成引导文件后&#xff0c;修复Windows引导用下面命令 /桌面# update-gru…...

深入理解 MVCC 与 BufferPool 缓存机制

深入理解 MVCC 与 BufferPool 缓存机制 在 MySQL 数据库中&#xff0c;MVCC&#xff08;Multi-Version Concurrency Control&#xff09;多版本并发控制机制和 BufferPool 缓存机制是非常重要的概念&#xff0c;它们对于保证数据的一致性、并发性以及提升数据库性能起着关键作用…...

vue实现下拉多选、可搜索、全选功能

最后的效果就是树形的下拉多选&#xff0c;可选择任意一级选项&#xff0c;下拉框中有一个按钮可以实现全选&#xff0c;也支持搜索功能。 在mounted生命周期里面获取全部部门的数据&#xff0c;handleTree是讲接口返回的数据整理成树形结构&#xff0c;可以自行解决 <div c…...

探秘Kafka源码:关键内容解析

文章目录 一、以kafka-3.0.0为例1.1安装 gradle 二、生产者源码2.1源码主流程图2.2 初始化2.3生产者sender线程初始化2.4 程序入口2.5生产者 main 线程初始化2.6 跳转到 KafkaProducer构造方法 一、以kafka-3.0.0为例 打开 IDEA&#xff0c;点击 File->Open…->源码包解…...

Android音频效果处理:基于`android.media.audiofx`包的原理、架构与实现

Android音频效果处理:基于android.media.audiofx包的原理、架构与实现 目录 引言Android音频框架概述android.media.audiofx包简介音频效果处理的原理 4.1 音频信号处理基础4.2 常见音频效果android.media.audiofx的架构设计 5.1 类结构分析5.2 设计模式应用系统定制与扩展 6…...

LeetCode - 初级算法 数组(两个数组的交集 II)

两个数组的交集 II 这篇文章讨论如何求两个数组的交集,并返回结果中每个元素出现的次数与其在两个数组中都出现的次数一致。提供多个实现方法以满足不同场景需求。 免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 描述 给定两个整数数组 nums1 和 nums2,以数…...

SQL 实战:分页查询的多种方式对比与优化

在处理大数据表时&#xff0c;分页查询是非常常见的需求。分页不仅可以提高用户体验&#xff0c;还能有效减少数据库查询返回的数据量&#xff0c;避免一次性加载大量记录引起的性能瓶颈。 然而&#xff0c;在数据量较大或复杂查询中&#xff0c;简单的分页方式可能导致性能下降…...

汇川Easy系列正弦信号发生器(ST源代码)

正弦余弦信号发生器CODESYS和MATLAB实现请参考下面文章链接: 正弦余弦信号发生器应用(CODESYS ST源代码+MATLAB仿真)_st语言根据输入值,形成正弦点-CSDN博客文章浏览阅读410次。本文介绍了如何在CODESYS编程环境中创建正弦和余弦信号发生器。通过详细的PLC梯形图和SCL语言代码…...

JavaSpring AI与阿里云通义大模型的集成使用Java Data Science Library(JDSL)进行数据处理

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…...

Three.js教程002:Three.js结合Vue进行开发

文章目录 Three.js结合Vue开发创建Vue项目安装依赖运行项目安装three使用three.js完整代码下载Three.js结合Vue开发 创建Vue项目 创建命令: npm init vite@latest框架这里选择【Vue】: 安装依赖 安装命令: cd 01-vueapp npm install运行项目 npm run dev...

pycharm+anaconda创建项目

pycharmanaconda创建项目 安装&#xff1a; Windows下PythonPyCharm的安装步骤及PyCharm的使用-CSDN博客 详细Anaconda安装配置环境创建教程-CSDN博客 创建项目&#xff1a; 开始尝试新建一个项目吧&#xff01; 选择好项目建设的文件夹 我的项目命名为&#xff1a;pyth…...

vue2中遇到的问题与解决方案(自用)

1 、在vue2中怎么能成功渲染字符串中存在自定义组件 比如&#xff0c;前端样式定义后由接口返回想渲染的样式&#xff0c;如果此时直接使用v-html&#xff0c;那么vue的自定义组件或者ui框架的组件是会被直接引用不能编译成功 解决方案&#xff1a; 此时想到vue官网使用render函…...

CF2043b-B. Digits

题目链接 题意&#xff1a;给定两个整数n、d&#xff0c;要求找出排列成n!个d之后的数可以被1-9中奇数整除的数 题解&#xff1a; 主要是考察分类讨论&#xff1a; 被3整除&#xff0c;当d能被3整除时一定成立或者n > 3&#xff0c;当n > 3时n!一定包含因数3 被5整除&a…...

AI时代测试人员如何转型

某老板&#xff1a;开发已经用AI提升了数倍的效率与产出&#xff0c;那测试呢&#xff1f;如果测试在AI时代掉队了&#xff0c;那是不是不需要测试了&#xff1f;某测试人员&#xff1a;我折腾了大半个月的AI&#xff0c;AI根本没办法给测试人员提效&#xff0c;它就像个弱智一…...

026 AI 漫剧工具推荐手册,附详细使用教程

2025 年&#xff0c;中国动画微短剧市场规模达 189.8 亿元&#xff0c;同比增长 276.3%&#xff0c;预计 2030 年将突破 850 亿元。与此同时&#xff0c;2026 年 AI 漫剧用户规模将从 1.2 亿飙升至 2.8 亿&#xff0c;市场规模有望突破 240 亿元。这一组数据有多震撼&#xff1…...

企业私有代码仓库建设:高可用、备份恢复与灾备方案复盘

开篇 企业内网私有化代码仓库&#xff0c;是研发资产的核心单点。一旦出现仓库不可用、数据丢失、分支错乱、权限越权&#xff0c;会直接导致研发停摆、资产外泄、合规不通过。很多团队初期用单机Git/SVN、简单文件备份&#xff0c;看似低成本&#xff0c;在多团队、高并发、信…...

盲人出行辅助系统原型

我做了一个很有意义的盲人出行辅助系统原型&#xff0c;主要是结合现有导航OSRM/高德&#xff0c;实时感知前方潜在危险目标&#xff0c;辅助视障人士出行。 持续优化中&#xff08;20260519&#xff09;&#xff0c;欢迎大家尝试&#xff0c;有一些想法也可以提出来。 开源地址…...

SpringBoot3路径匹配新范式:从AntPathMatcher到PathPattern的实战解析

1. 为什么SpringBoot3要重构路径匹配机制&#xff1f; 如果你用过SpringBoot2.x版本&#xff0c;肯定对RequestMapping中的/user/**这种路径匹配方式不陌生。这种基于Ant风格的路径匹配&#xff0c;在SpringBoot3中迎来了重大升级。我在升级公司老项目时第一次遇到这个问题——…...

区块链跨链桥接:原理与实现

区块链跨链桥接&#xff1a;原理与实现 大家好&#xff0c;我是欧阳瑞&#xff08;Rich Own&#xff09;。今天想和大家聊聊区块链跨链桥接这个重要话题。作为一个Web3探索者&#xff0c;跨链技术是连接不同区块链生态的关键。今天就来分享一下跨链桥接的原理和实现方式。 什…...

昇腾NPU算子开发进阶:深入理解ops-tensor中的解决方案注册机制 [特殊字符]

昇腾NPU算子开发进阶&#xff1a;深入理解ops-tensor中的解决方案注册机制 &#x1f680; 【免费下载链接】ops-tensor ops-tensor 是 CANN &#xff08;Compute Architecture for Neural Networks&#xff09;算子库中提供张量类计算的基础算子库&#xff0c;采用模块化设计&a…...

边缘计算与机器视觉在产线质检中的实战应用与优化

1. 项目概述&#xff1a;当产线质检遇上边缘计算与机器视觉在制造业的车间里&#xff0c;质检环节一直是效率与质量的“卡脖子”点。传统的人工目检&#xff0c;不仅劳动强度大、易受疲劳和情绪影响&#xff0c;而且标准难以统一&#xff0c;漏检、误检时有发生。而将高清相机拍…...

如何用Univer在3小时内构建企业级电子表格应用?5个实战技巧分享

如何用Univer在3小时内构建企业级电子表格应用&#xff1f;5个实战技巧分享 【免费下载链接】univer Build AI-native spreadsheets. Univer is a full-stack framework for creating and editing spreadsheets on both web and server. With Univer Platform, Univer Spreadsh…...

CNAS实验室一份完整的质量手册需要包含哪些要素?一文教会质量手册编写

编写质量管理体系文件是CNAS实验室认证工作中非常重要的一个环节&#xff0c;实验室质量管理体系文件按照惯例&#xff0c;一般会分为四个层级&#xff0c;质量手册、程序文件、作业指导书和记录文件。实验室质量手册是实验室依据相关标准制定的纲领性文件&#xff0c;系统规定…...