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

别再暴力搜索了!用Python实现Manacher算法,轻松搞定LeetCode 5(最长回文子串)

从暴力搜索到Manacher算法Python实战最长回文子串在算法竞赛和面试中字符串处理问题总是高频出现。LeetCode第5题最长回文子串就是一个经典案例它要求我们在给定字符串中找到最长的回文子串。回文串是指正读反读都相同的字符串比如aba、abba都是回文串。这个问题看似简单但想要高效解决却需要一些巧妙的算法技巧。1. 问题分析与暴力解法1.1 问题定义与直观解法给定一个字符串s我们需要找到其中最长的回文子串。最直观的解法是暴力搜索枚举所有可能的子串然后检查每个子串是否是回文。这种方法虽然简单直接但时间复杂度高达O(n³)当字符串长度达到1000时这种解法显然无法在合理时间内完成。def is_palindrome(s): return s s[::-1] def longest_palindrome_brute_force(s): n len(s) max_len 0 result for i in range(n): for j in range(i1, n1): substring s[i:j] if is_palindrome(substring) and len(substring) max_len: max_len len(substring) result substring return result1.2 中心扩展法优化暴力解法的低效主要来自于重复检查子串。中心扩展法则通过利用回文串的对称性将时间复杂度优化到O(n²)。其核心思想是每个回文串都有一个中心从这个中心向两边扩展直到字符不再匹配。def expand_around_center(s, left, right): while left 0 and right len(s) and s[left] s[right]: left - 1 right 1 return left 1, right - 1 def longest_palindrome_center(s): start, end 0, 0 for i in range(len(s)): l1, r1 expand_around_center(s, i, i) # 奇数长度 l2, r2 expand_around_center(s, i, i 1) # 偶数长度 if r1 - l1 end - start: start, end l1, r1 if r2 - l2 end - start: start, end l2, r2 return s[start:end1]2. Manacher算法详解2.1 算法核心思想Manacher算法由Glenn Manacher于1975年提出它通过巧妙地利用回文串的对称性将时间复杂度进一步降低到O(n)。算法的核心在于预处理在字符间插入特殊字符(如#)将奇偶长度的回文串统一处理利用对称性记录当前已知的最右回文边界及其中心利用对称性避免重复计算动态扩展根据对称位置的信息确定当前字符的初始回文半径再向外扩展2.2 关键概念与实现Manacher算法引入了几个重要概念p数组记录每个位置的回文半径C和R当前已知的最右回文边界R及其中心Cdef preprocess(s): return # #.join(s) # def manacher(s): T preprocess(s) n len(T) P [0] * n C, R 0, 0 for i in range(1, n-1): mirror 2 * C - i # i关于C的对称点 if i R: P[i] min(R - i, P[mirror]) # 尝试扩展 a, b i (1 P[i]), i - (1 P[i]) while a n and b 0 and T[a] T[b]: P[i] 1 a 1 b - 1 # 更新C和R if i P[i] R: C i R i P[i] # 找到最大回文子串 max_len max(P) center P.index(max_len) start (center - max_len) // 2 end start max_len return s[start:end]2.3 算法复杂度分析Manacher算法的时间复杂度为O(n)空间复杂度也是O(n)。这是因为每个字符最多被比较两次一次在确定初始半径时一次在扩展时需要额外的数组存储每个位置的回文半径3. 算法优化与边界处理3.1 预处理优化预处理阶段插入特殊字符的方式可以优化避免字符串拼接带来的性能开销def preprocess_optimized(s): n len(s) processed [] * (2 * n 1) for i in range(n): processed[2 * i] # processed[2 * i 1] s[i] processed[-1] # return .join(processed)3.2 边界条件处理在实际实现中需要特别注意以下边界条件空字符串输入单字符字符串全相同字符的字符串已经完全是回文的字符串def manacher_with_edge_cases(s): if not s: return if len(s) 1: return s T preprocess_optimized(s) n len(T) P [0] * n C, R 0, 0 max_len, center 0, 0 for i in range(1, n-1): mirror 2 * C - i if i R: P[i] min(R - i, P[mirror]) a, b i (1 P[i]), i - (1 P[i]) while a n and b 0 and T[a] T[b]: P[i] 1 a 1 b - 1 if i P[i] R: C i R i P[i] if P[i] max_len: max_len P[i] center i start (center - max_len) // 2 end start max_len return s[start:end]4. 实际应用与性能对比4.1 LeetCode实战测试我们在LeetCode测试平台上对三种解法进行性能对比方法时间复杂度空间复杂度LeetCode运行时间(ms)暴力搜索O(n³)O(1)超出时间限制中心扩展法O(n²)O(1)896Manacher算法O(n)O(n)684.2 不同场景下的表现针对不同类型的输入字符串各算法的表现也有所不同短字符串(长度100)三种方法差异不大长重复字符串(如aaaaa...)Manacher算法优势明显随机字符串Manacher算法稳定高效4.3 Python实现技巧在Python中实现Manacher算法时有几个优化点值得注意使用列表而非字符串拼接进行预处理提前终止不必要的扩展利用Python的切片特性简化代码def manacher_pythonic(s): if not s: return T #.join(^{}$.format(s)) n len(T) P [0] * n C R 0 for i in range(1, n-1): P[i] (R i) and min(R - i, P[2*C - i]) while T[i 1 P[i]] T[i - 1 - P[i]]: P[i] 1 if i P[i] R: C, R i, i P[i] max_len, center max((n, i) for i, n in enumerate(P)) return s[(center - max_len)//2 : (center max_len)//2]5. 算法扩展与应用5.1 变种问题解决Manacher算法不仅可以解决最长回文子串问题还能应用于统计所有回文子串数量查找最短回文插入回文分割问题5.2 统计所有回文子串利用Manacher算法中的p数组可以高效统计所有回文子串def count_palindromic_substrings(s): T preprocess(s) n len(T) P [0] * n C R 0 count 0 for i in range(1, n-1): mirror 2 * C - i if i R: P[i] min(R - i, P[mirror]) while (i P[i] 1 n and i - P[i] - 1 0 and T[i P[i] 1] T[i - P[i] - 1]): P[i] 1 if i P[i] R: C i R i P[i] count (P[i] 1) // 2 return count5.3 实际工程应用在文本处理、DNA序列分析、数据压缩等领域回文识别都有重要应用。Manacher算法的高效性使其成为这些场景下的首选算法。

相关文章:

别再暴力搜索了!用Python实现Manacher算法,轻松搞定LeetCode 5(最长回文子串)

从暴力搜索到Manacher算法:Python实战最长回文子串 在算法竞赛和面试中,字符串处理问题总是高频出现。LeetCode第5题"最长回文子串"就是一个经典案例,它要求我们在给定字符串中找到最长的回文子串。回文串是指正读反读都相同的字符…...

告别mstsc!用C# WinForm打造一个专属的远程桌面管理工具(支持Win11)

用C# WinForm构建企业级远程桌面管理工具 每次打开Windows自带的远程桌面连接工具mstsc,面对那个简陋的界面和每次都要重复输入的服务器信息,作为.NET开发者的你是否感到效率低下?本文将带你从零开始,用C# WinForm打造一个功能强大…...

企业大模型私有化部署完全指南:数据不出门,智能照样顶

别再让核心数据裸奔了!三步搭建你自己的AI能力中心,成本不到云服务的一半引言:为什么2026年每家企业都该有个“私人大模型”?你有没有遇到过这种情况:想让AI帮忙分析公司上季度的销售数据,但又怕把Excel上传…...

魔兽争霸3终极优化方案:用WarcraftHelper解决现代系统兼容性问题

魔兽争霸3终极优化方案:用WarcraftHelper解决现代系统兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电…...

别再只会用`uvm_object_utils`了!拆解宏定义,搞懂UVM工厂注册的底层逻辑

深入拆解UVM工厂注册机制:从宏定义到对象创建的全链路解析 在芯片验证领域,UVM(Universal Verification Methodology)作为行业标准方法论,其工厂模式(Factory Pattern)的设计精妙程度常常被使用…...

从助听器到嫦娥四号:聊聊通用技术里那些‘活’的考点,帮你轻松搞定高考选择题

从助听器到嫦娥四号:技术考点背后的思维跃迁 高考通用技术科目中,"技术的性质"这一考点常常让考生感到抽象难懂。但如果我们把课本上的六个性质——目的性、创新性、综合性、两面性、专利性和相关性——与现代科技发展的鲜活案例结合起来&…...

避开中介效应陷阱:经济学论文机制检验的另类思路与实操解析

经济学机制检验的突围之路:当中介效应模型不再适用时如何破局 经济学研究中对因果关系的执着追求,使得机制检验成为论文中最令人辗转反侧的部分。当审稿人要求"请补充机制分析"时,许多研究者会条件反射般地打开中介效应模型的Stata…...

企业信用查询怎么查?避坑指南+实操步骤

企业信用查询怎么查?最直接的方式是通过官方渠道或第三方平台,但很多人不知道,错误的查询方法可能会遗漏关键风险。根据2026年行业数据,68%的用户因信息分散导致风险识别不全。那么,如何高效、全面地查询企业信用呢&am…...

保姆级图解:用Wireshark抓包实战,一步步拆解PCIe链路训练(LTSSM)的完整握手过程

保姆级图解:用Wireshark抓包实战,一步步拆解PCIe链路训练(LTSSM)的完整握手过程 当一块全新的PCIe设备插入主板后,系统却始终无法识别——这种场景对硬件工程师而言再熟悉不过。此时,协议分析仪上跳动的TS1…...

你的项目电量测量方案选对了吗?从手机充电到工业电池包,聊聊库仑计的那些“坑”

你的项目电量测量方案选对了吗?从手机充电到工业电池包,聊聊库仑计的那些“坑” 当手机电量显示从20%骤降到5%时,我们往往会抱怨电池不耐用。但很少有人思考:这个数字背后究竟是如何计算出来的?在消费电子领域&#xf…...

Kandinsky-5.0-I2V-Lite-5s GPU显存策略详解:offload机制在24GB卡上的工程实现

Kandinsky-5.0-I2V-Lite-5s GPU显存策略详解:offload机制在24GB卡上的工程实现 1. 模型概述与技术背景 Kandinsky-5.0-I2V-Lite-5s是一款轻量级图生视频模型,能够将单张输入图片转换为约5秒、24fps的短视频。与完整版相比,Lite版本通过模型…...

MinerU 系列教程 第十八课:Magic Model 转换层详解

MinerU 系列教程 第十八篇 本篇教程作为 模块五:原理篇 - 数据流与中间格式 的第二课,将深入剖析 MinerU 的 Magic Model 转换层。每种后端都有一个专属的 Magic Model,负责将各自的原始输出标准化为上一课学习的 Middle JSON 块结构。本课将揭示四个版本的 Magic Model 在块…...

生物质锅炉自动上料控制系统功率MOSFET选型方案——高效、可靠与长寿命驱动系统设计指南

生物质锅炉自动上料控制系统作为锅炉高效稳定运行的核心,其驱动电路的性能直接决定了上料的精确性、响应速度及系统整体可靠性。功率MOSFET作为电机驱动、电磁阀控制及电源管理的核心开关器件,其选型需应对高粉尘、温度波动及连续作业的严苛工业环境。本…...

晶体管工作原理与半导体技术解析

1. 晶体管工作原理与半导体技术解析1947年圣诞节前夕,贝尔实验室的两位物理学家约翰巴丁和沃尔特布拉顿在锗晶体表面放置了两个相距仅0.05毫米的金属触点,意外发现这个简单装置能够放大电信号。这个被称为"点接触晶体管"的发明,彻底…...

面向高端汽车暖风系统控制器的功率MOSFET选型策略与器件适配手册

随着汽车电气化与智能化进程加速,高端汽车暖风系统(HVAC)正朝着高能效、高功率密度、高可靠性及智能热管理方向演进。其核心控制器需精准驱动PTC加热器、高效水泵、散热风扇及风门电机等多元负载,功率MOSFET作为电能转换与分配的执…...

多线程缓存性能优化与内存子系统深度解析

1. 多线程缓存性能的本质矛盾现代处理器设计中,缓存系统对性能的影响远超大多数程序员的想象。当我们把视线投向多线程环境时,缓存行为会呈现出一些反直觉的特性。以典型的Intel Core 2 Duo处理器为例,其每个核心拥有32KB L1数据缓存和4MB共享…...

PDF与电子表格智能同步工具的技术实现与优化

1. 项目概述:PDF与电子表格的智能同步工具PDFMerge是一个持续开发中的工具项目,旨在解决PDF表单与电子表格(如Google Sheets)之间的数据同步难题。作为一名长期与表单打交道的开发者,我深知手动在PDF和电子表格之间来回…...

为什么92%的.NET开发者还在用同步推理?揭秘.NET 11新增System.AI命名空间与异步流式推理的5个关键转折点

第一章:.NET 11 AI推理加速的演进背景与核心价值近年来,AI模型规模持续膨胀,从百亿参数大语言模型到多模态实时推理场景,对底层运行时的低延迟、高吞吐与跨硬件可移植性提出前所未有的挑战。.NET 平台长期以企业级稳定性与开发效率…...

隐形Unicode技巧:新型JavaScript混淆方法被用于针对美国PAC附属机构的网络钓鱼攻击

一种创新的JavaScript混淆技术正被积极滥用,该技术利用不可见的Unicode字符将恶意代码伪装成空白,从而在网络钓鱼攻击中有效规避检测。该攻击主要针对美国政治行动委员会(PAC)附属机构。 网络威胁实验室(Juniper Thre…...

Bootstrap4 导航栏

Bootstrap4 导航栏 概述 Bootstrap4 是一个流行的前端框架,它提供了丰富的组件和工具来帮助开发者快速构建响应式、移动优先的网页。在Bootstrap4中,导航栏是一个重要的组件,用于在网页上创建顶部导航菜单。本文将详细介绍Bootstrap4导航栏的用法、样式和定制选项。 导航…...

IoT安全实战:手把手教你用Wireshark检测RPL协议中的Hello-Flood攻击

IoT安全实战:手把手教你用Wireshark检测RPL协议中的Hello-Flood攻击 在智能家居和工业物联网场景中,低功耗网络的安全威胁往往隐藏在看似正常的协议交互中。最近处理的一个案例让我印象深刻:某工厂传感器网络频繁出现数据延迟,最初…...

ESP32-CAM发热严重还卡顿?可能是你的供电和代码没调对(附优化参数)

ESP32-CAM发热与卡顿问题深度优化指南 最近在工作室调试ESP32-CAM时,发现不少朋友都遇到了类似的问题:模块运行一段时间后烫得能煎鸡蛋,视频流还时不时卡成PPT。这让我想起去年做智能门铃项目时,连续烧坏三块板子的惨痛经历。经过…...

PDF-XSS漏洞:从原理到实战的深度剖析

1. PDF-XSS漏洞的本质与危害 第一次听说PDF文件也能执行恶意代码时,我和大多数安全新手一样感到不可思议。毕竟在我们日常认知里,PDF就是个安全的文档格式,谁会想到它能成为攻击载体?直到有次在渗透测试中,我亲眼看到同…...

手把手教你用CarMaker 10.2和Matlab R2021a搭建联合仿真环境(附避坑指南)

从零开始构建CarMaker与Simulink联合仿真环境的完整指南 当车辆动力学仿真遇到控制系统设计,CarMaker与Simulink的联合仿真环境就像给工程师装上了涡轮增压器。这个强大的组合允许你在高度逼真的虚拟测试环境中验证控制算法,而无需等待物理原型。想象一下…...

HBuilderX 3.1.22+ 原生隐私弹窗配置全攻略:手把手解决App上架因IMEI、MAC地址收集被拒

HBuilderX 3.1.22原生隐私弹窗配置实战:合规获取设备信息的完整方案 当你的应用因为"在用户同意隐私政策前收集IMEI、MAC地址等设备信息"被应用商店拒绝时,那种反复修改仍无法过审的挫败感我深有体会。去年我们团队的一款工具类App在华为应用市…...

c++ openimageio工具 c++如何使用oiiotool进行图像批量处理

oiiotool命令行比C API更稳更快,适用于缩放、格式转换、通道提取等批量处理;C API仅适合深度集成场景,且需避免ImageBufAlgo::resize,改用ImageBuf流程并显式管理spec与错误。oiiotool 命令行用法比 C API 更直接绝大多数图像批量…...

CSS实现盒子倒角不规则效果_利用border-radius多个值

border-radius需按1/2/4值规则设置,四角不规则倒角须用“水平/垂直”双值写法,IE11不支持斜杠语法,超尺寸值会被自动裁剪,单位混用和空格错误易致解析失败。border-radius 支持四个角分别设置,但值必须成对或单个很多人…...

用JSBSim和VS2019搭建你自己的简易飞行仿真器(从模型加载到数据获取)

用JSBSim和VS2019构建高交互性飞行仿真器的实战指南 飞行仿真技术一直是航空航天领域的重要工具,从专业训练到娱乐游戏,这项技术正在变得越来越普及。对于开发者而言,构建自己的飞行仿真器不仅能深入理解飞行力学原理,还能为更复杂…...

AI重塑工程实践:未来工程师必备能力图谱

技术演进背景 AI技术重塑工程实践范式:从自动化工具到决策辅助,工程师需掌握新能力维度。传统编码能力与系统设计经验仍为核心,但需叠加数据驱动思维与AI协同技能。 核心能力进化方向 数据感知力 理解数据生成逻辑与质量评估构建数据闭环…...

别只用来抓包了!Burp Suite的Filter、Comparer和Decoder模块,帮你高效分析漏洞与调试API

深度挖掘Burp Suite三大隐藏利器:Filter、Comparer与Decoder的高阶应用 Burp Suite作为安全测试领域的瑞士军刀,其核心模块Proxy和Intruder早已被广泛使用。但真正的高手往往更善于利用那些被多数人忽视的辅助模块——Filter、Comparer和Decoder。这些工…...