字符串的最长回文子串——Manacher算法

【字符串】最长回文子串 本来是做动态规划找到这道题的,然而这道题用动态规划并不好做,最暴力的方法就是枚举端点i j,判断这个范围内的字符串是否为回文,不过时间复杂度是O(n^3),不太理想; 另外一种方法就是,枚举每一个点,看它两端的点是否相同,若相同则证明这三个字符是回文,接着扩大范围判断这五个字符是不是回文……但是这样只能判断奇数长度的回文,所以还要判断偶数长度的回文,同样枚举每一个点,判断这个字符能否和它右端的字 阅读详情

字符串的最长回文子串——Manacher算法

问题

对于给定的字符串,求算其最长的回文子串 。

Manacher算法

在学习算法时候,发现非常有趣的一个算法,除了它的名字(马拉车算法)很有意思,在去掉重复计算的子串上也有一定的借鉴意义。

消除奇偶回文串的影响,在字符串中间隔插入‘#’,可以将奇偶回文串都变成奇数回文串,方便进行计算:

s = '$' + '#' + '#'.join(s) + '#' + '\0'

在新的字符串中,我们令 r[i] 为以 i 为中心的回文子串半径,我们在纸上写一写可以发现,这个回文半径与原字符串中以 i 为中心的回文子串相差为 1,也就是:

 ansLen = r[i] - 1

之后,进入算法的主要内容。

设 maxRight 为目前查找到回文串中能够触及的母串最右边,我们令回文串的中心为 maxPos。对于当下求算的回文中心 i,必然存在 i > maxPos,因为 maxPos 我们已经找过了嘛。
这个时候存在几种情况,在这些情况中以 i 为中心的回文串被之前内容计算过的情况不同(提高效率的方法就是不再进行已经计算过的内容)。

  1. i < maxRight;该情况意味着在 maxPos 回文串中,i 存在对称的 j,且 j 的回文半径在之前已经求过了,那么我们可以求出 r[i] 被重复计算过的部分半径,即r[i] = min(r[2 * maxPos - i], maxRight - i);
    那,这是为什么呢?因为 i 与 j 对称,那能够想到 r[j] 与 r[i] 可能是一样的,但如果 j 的字串对称过来超过了我们的 maxRight,超过部分就不和 i 两边的字符对称了,因此这个对称半径的大小需要在 maxRight 内。
  2. i >= maxRight;如果 i 超过了 maxRight,那必然没有对称情况了,令 r[i] = 1是非常明确的了。

确定跳过重复计算的部分后,就可以从 i 为中心,r[i] 为已知半径向外进行逐个的扩张了,即:

while s[i - r[i]] == s[i + r[i]]: r[i] += 1

最后,我们要以当前 i 查找到的回文子串对 maxPos 和 maxRight 进行更新,当然也少不了我们需要的结果 ansLen 了:

if r[i] + i > maxRight:
	maxPos = i
	maxRight = r[i] + i
if ansLen < r[i] - 1:
	ansLen = r[i] - 1

算法代码

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        s = '$' + '#' + '#'.join(s) + '#' + '\0'
        	# 前后加上不同字符能够使中心对称时不需要进行边界判断
        
        r = [0] * len(s)

        #print(r)

        maxRight = 0
        maxPos = 0

        ansLen = -1
        ansPos = 0

        for i in range(1, len(s) - 1):
            if i < maxRight:
                r[i] = min(r[2 * maxPos - i], maxRight - i)
            else:
                r[i] = 1
            
            while s[i - r[i]] == s[i + r[i]]:
                r[i] += 1
            
            if r[i] + i > maxRight:
                maxPos = i
                maxRight = r[i] + i
            
            if ansLen < r[i] - 1:
                ansLen = r[i] - 1
                ansPos = i
    
        return s[ansPos - ansLen + 1: ansPos + ansLen].replace('#', '')
【GB28181】wvp-GB28181-pro部署安装教程(Ubuntu平台) 初始环境安装。 阅读详情

相关推荐

Ultralytics YOLO模块自定义与替换实战技巧

本文详细介绍了在Ultralytics YOLO框架中进行模块自定义与替换的实战技巧。通过从零开始添加全新模块(如注意力模块)到进阶替换现有模块(如增强版卷积),并涵盖模块注册、YAML配置、模型融合及ONNX导出等关键步骤,帮助开发者深度定制YOLO模型,以应对复杂检测任务与部署需求。

numpy6sculptor的博客 931

Manacher (马拉车算法)

Manacher (马拉车算法) 的介绍 中心扩展算法 —— 优化 —— 马拉车 P3805 模板manacher 算法 P1659 [国家集训队]拉拉队排练 P4555 [国家集训队]最长双回文串

日常记录,挨打要立正! 2万+

【Ultrascale+ MPSOC学习记录】10、PS端以太网使用lwip

还是参考ALINX教程,学习PS端以太网如何使用,从教程中可以看到,开发板使用了一个xilinx默认不支持的phy JL2121,所以需要修改lwip的库源码。

ryo891012的博客 882

22562 Problem A 【字符串】最长回文子串

问题 A: 【字符串】最长回文子串 时间限制: 1 Sec  内存限制: 128 MB 提交: 64  解决: 34   题目描述         输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同。如abba和yyxyy。在判断回文时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多...

漫浸天空的雨色的备忘录~ 1364

YOLOv8模型RKNN量化策略与RK3588部署实战解析

本文详细解析了YOLOv8模型在RK3588平台上的RKNN量化策略与部署实践。通过对比INT8和FP16量化方式的性能差异,结合实际测试数据,为开发者提供了从模型导出、转换到板端部署的完整解决方案,帮助实现高效的边缘AI应用部署。

oil88的博客 1102

YOLOv5+Astra Pro Plus深度相机:手把手教你实现实时目标检测(附ROS配置技巧)

本文详细介绍了如何将YOLOv5目标检测算法与Astra Pro Plus深度相机结合,构建实时目标检测系统。内容涵盖从硬件选型、环境搭建、ROS配置到YOLOv5部署与深度信息融合的完整流程,并分享了性能优化、避障算法等实战技巧,帮助开发者在机器人视觉等场景中快速实现智能感知应用。

weixin_28292761的博客 390

最长回文子字符串 还要更简单的方法

最长回文子串 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000

DSH0106的专栏 908

电源新手别怕!手把手教你搞定Buck电路的环路补偿(附Type II/III补偿器参数计算)

本文为电源设计新手详细解析Buck电路环路补偿技术,重点介绍Type II和Type III补偿器的参数计算与设计方法。通过实例演示和实用技巧,帮助工程师快速掌握环路补偿原理,解决电源振荡、响应慢等问题,提升电路稳定性与性能。

weixin_30607029的博客 621

计算字符串的最长回文子串 :Manacher算法介绍

转自:http://www.open-open.com/lib/view/open1419150233417.html Manacher算法 在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简单来说就是正着读和反着读都是一样的字符串,比如abba,noon等等,一个字符串的最长回文子串即为这个字符串的子串中,是回文串的最长的那个。 计 算字符串的最长回文字串最简单的算法就是枚举该...

weixin_30439031的博客 237

Python处理高光谱数据#3 降维

基于Python的高光谱降维操作 高光谱数据:点击此处可下载 用到的库:matplotlib、scipy、spectral 主要内容:主成分分析(PCA)与线性判别(LDA) 欢迎有兴趣的朋友交流指点。最后,废话不多说直接上代码???? import matplotlib.pyplot as plt from scipy.io import loadmat import spectral as spy

qq_273058791的博客 6939

01-认识脑电信号及相关信号的预处理过程

脑电信号处理过程脑电实验为什么要预处理预处理方法降采样如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 脑电实验 本博客主要是记录基于脑电信号的情绪识别方法的研究...

脑机交流者的博客 7660

Manacher算法讲解——字符串最长回文子串

最长回文子串,不是哈希+二分随便过?????

DD(XYX)的硫氰化氘博客 225

超10万,两台Mac Studio在家就能跑满血DeepSeek,网友:这是性价比最高的大模型一体机

在AI计算领域,没有比这更强的个人电脑了。这要从它的架构说起。对于那些有本地部署满血版DeepSeek需求的用户,目前建议的配置是选购512GB统一内存 + 1TB SSD,搭载M3 Ultra芯片的Mac Studio,官网售价74249元,可以叠加国补、教育优惠、12期分期等,这可能是目前门槛最低、性价比最高的满血版DeepSeek本地部署方案。对于企业而言,尽管Mac Studio确实可以部署6000亿参数的大模型,但在内存带宽、模型精调服务等方面,跟专用的大模型一体机仍有差距,采购需要谨慎评估。

2501_90444774的博客 1918

Manacher算法 马拉车算法 查找一个字符串的最长回文子串的线性算法

Manacher算法 马拉车算法 查找一个字符串的最长回文子串的线性算法 摘自https://blog.youkuaiyun.com/dyx404514/article/details/42061017 Manacher算法 算法总结第三弹 manacher算法,前面讲了两个字符串相算法——kmp和拓展kmp,这次来还是来总结一个字符串算法,manacher算法,我习惯叫他 “马拉车”算法。 相...

mrcrack的博客 311

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

字符串算法之Manacher(最长回文子串)

一、背景   在介绍算法之前,首先介绍一下什么是回文串,所谓回文串,简单来说就是正着读和反着读都是一样的字符串,比如abba,noon等等,一个字符串的最长回文子串即为这个字符串的子串中,是回文串的最长的那个。   计算字符串的最长回文字串最简单的算法就是枚举该字符串的每一个子串,并且判断这个子串是否为回文串,这个算法的时间复杂度为O(n^3)的,显然无法令人满意,稍微优化的一个算法是枚举回文...

青萍之末的博客 1179

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

字符串Manacher算法-最长回文子串

x为奇数。

2301_81354767的博客 616

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

字符串算法之Manacher 算法(最长回文子串)详细解读

Manacher算法广泛应用于文本处理、自然语言处理、基因序列分析等领域。由于其高效性,适合用于需要频繁查找回文子串的场景。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 836

Manacher算法——查找一个字符串中的最长回文子串

Manacher算法

z1171127310的博客 692

Codeup 问题 A: 【字符串】最长回文子串 manacher算法

原题地址 http://codeup.hustoj.com/problem.php?cid=100000629&pid=0 题目大意 输入一个字符串,求出其中最长的回文子串。在判断回文时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。输入字符串长度不超过 500050005000,且占据单独的一行。应该输出最长的回文串,如果有多个,输出起始位置最靠左的。 解题思路 一开始用dp的方法做,告诉我空间超限了,一看诶长度最大是 500050005000

Encore47的博客 216

Manacher算法求字符串的最长回文子串

在求字符串的最长回文子串时,绝大部分的算法的时间复杂度都将达到o(n^2)甚至达到o(n^3),而Manacher算法却可以达到o(n)。     通过在每个字符的两边都插入一个特殊的符号,将所有的字符串都转化成为奇数长度。然后创建一个新的P[i]表示,以第i个字符为中心的回文字串的半径。 对应的P如下,设S为原始字符串: 通过观察上面的表,大家可以发现P[i]-1就是实际回文字串的长度

赢在拼搏中 302

字符串之最长回文子串 manacher算法

manacher算法 来源:http://blog.youkuaiyun.com/xingyeyongheng/article/details/9310555

dingzuoshou的专栏 375

manacher算法:马拉车算法:返回字符串s的最长回文子串长度

1)回文串的基本概念,回文半径,回文区域,回文右边界,中心啥的,理解透彻 2)整个manacher算法的关键在如何舍弃不需要再对比的地方,然后填写回文半径数组pArr,最后更新给max 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

weixin_46838716的博客 689

Manacher算法求解字符串的最长回文子串

package jinjie_class_01; import java.util.Arrays; /** * Manacher算法 * @author lenovo * */ public class Code_04_Manacher { public static char[] manacherString(String str) { char[] ch...

汤小萌的博客 387

Manacher算法——字符串最长回文子串问题O(N)

package Manacher import ( "math" "math/rand" "testing" "time" ) // Manacher算法 解决最长回文子串问题 // abcba abba 长度为奇数和长度为偶数的回文都可以 // 可以认为有一个轴 在实的位置或虚的位置 // Manacher 解决在一个字符串中最长回文子串有多大这个问题 // 最长回文子序列是动态规划的问题,子串必须是连续的 // 回文 DNA是一些序列,可以认为是字符串,DNA的一些基因片段具有回文

Go的全部 717

【超好懂的字符串算法笔记】Manacher(马拉车)算法——找最长回文子串问题

title : Manacher(马拉车) date : 2021-11-8 tags : ACM,字符串 author : Linno 问题描述 给定一个长度为n的字符串s,请找到所有对(i,j)使得子串s[i...j]为一个回文串。给定一个长度为n的字符串s ,请找到所有对(i,j)使得子串s[i...j]为一个回文串。给定一个长度为n的字符串s,请找到所有对(i,j)使得子串s[i...j]为一个回文串。 给定一个长度为n的字符串s,请找到最长回文子串及其长度给定一个长度为n的字符串s ,请找到.

SC_Linno的博客 275

字符串的最长回文子串--manacher算法

预备知识: 字符串概念 回文子串概念 朴素算法: 通常我们熟知的求解字符串的最长回文字串的方法有以下两种算法: 1、O(n^2)枚举子串的左右两个端点->O(n)判断该子串是否为回文串:总复杂度O(n^3); 2、O(n)枚举每一个回文子串的中点(偶数长度类似,不做讨论)->O(n)向两端拓展:总复杂度O(n^2)。 然而在一般的算法竞赛中,O(n^2)复杂度求回文...

xbb0720的博客 1111
上一篇: Python爬虫 获取免费的代理Ip
下一篇: 《算法导论》 练习 2.1
逗le个芽
博客等级 码龄11年 0粉丝 9原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值