manacher算法

回文串的性质

回文串类似于ABA,ABCBA,AABBAA等的对于i具有s[i]=s[n+!-i]的字符串。

回文半径:对于一个回文中心i,如果它的半径为r,如果它为奇数长度的回文串的中心,则说明[i+r+1,i+r-1]为一个回文串。如果i是偶数长度的回文中心,则回文半径没有意义。(Manacher算法会解决这个问题)

它会将偶数的回文长度转化为奇数的回文长度。

Manacher算法

前面说过,回文半径对于偶数长度的回文的中心没有意义,例如ABBA中的B就不存在回文半径。
为了解决这个问题,Manacher发明了一种算法,他将所有的回文串都转化为了奇数长度的回文串。
方法就是在字符串中间和头尾插入特殊字符,例如原字符串为ABBA,转换后变^#A#B#B#A#$,于是我们就可以得到^#A#B#B#A#$中红色位置的回文半径为5,它就表示在原字符串中的回文半径为5-1=4 (这个原因待会儿会解释)。
Manacher算法是一种O(n)复杂度计算字符串中每个位置作为回文中心的回文半径的算法
位置i的回文半径以p[i]表示,意思是在转换后的字符串中[i-p[i]+1,i+p[i]-1]是回文的

(P[i]-1)是因为不管是以原来字符还是以特殊字符为回文中心,特殊字符都会比原来字符多1 

 转换后的字符串中回文半径为p[i],说明在转换前的回文串长度为p[i]-1

 

 Manacher算法流程

转换后的字符串的有效区间为[1,2*n+1],所以我们从1到2*n+1去遍历所有点。

如果i<R说明i存在关于C(C是此时最右侧的R对应的对称中心)的对称点2C-i,那么p[2C-i],当然为了防止越界,要和R-i取小。

如果i>=R说明i已经无法通过C找到对称点了,因此此时i不在C的回文区间中,就不存在回文的递归性质。

int[] p=new int [str.length()];
int max=1;//最长回文子串的长度
int r=0;
int c=0;
for(int i=1;i<str.length()-1;i++){//str.length()-1表示的是新构成的字符串的长度p[i]=r>i?Math.min(p[2*c-i],r-i):1;
//判断是否超过最右的边界。和对称点后面的r-i取小while(str.charAt(i+p[i])==str.charAt(i-p[i])){
//从中心向两边扩展,如果它一直相等,我们的p[i]就会一直++p[i]++;}if(p[i]+i>r){
//如果p[i]+i>r表示右边界被更改了,我们的回文中心也要进行更改r=p[i]+i;c=i;}max=Math.max(max,p[i]-1);
//最后更新以下最长回文子串的长度
}
//r:现有的所有回文子串中,最大的右边界(回文子串不包括r)
//c:上述r对应回文子串的中心点

例题

最长回文子串

题目描述

给定一个字符串S,请你求出S的最长回文子串

输入描述

仅输入遗憾,包含一个字符串S

1<=|S|<=5*10^5,保证S只包含小写字母,大写字母,数字。

输出描述

输出共1行,包含一个整数,表示答案

示例1

aa1ABAlb

输出

5

完整代码

package lanqiao;
import java.util.*;
public class onetwotwofive {public static void main(String[] args) {// TODO Auto-generated method stubScanner scan=new Scanner(System.in);String s=scan.next();long num=manacher(s);System.out.println(num);}public static long manacher(String s) {int c=0,r=0;long max=1;StringBuilder str=new StringBuilder();str.append("!");for(int i=0;i<s.length();i++) {str.append("#");str.append(s.charAt(i));}str.append("#$");int[] p=new int[str.length()];for(int i=1;i<str.length()-1;i++) {p[i]=r>i?Math.min(p[2*c-i],r-i):1;while(str.charAt(p[i]+i)==str.charAt(i-p[i])) {p[i]++;}if(p[i]+i>r) {r=p[i]+i;c=i;}max=Math.max(max, p[i]-1);}return max;}}

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

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

相关文章

xtrabackup2.4

xtrabackup2.4只能备份5.*版本 [rootk8s-131 src]# mysql -V mysql Ver 14.14 Distrib 5.7.35, for linux-glibc2.12 (x86_64) using EditLine wrapper [rootk8s-131 src]# ll total 658516 -rw-r--r--. 1 7161 31415 666328842 Jun 7 2021 mysql-5.7.35-linux-glibc2.12-x…

最新版弹幕播放器源码,带后台

最新版弹幕播放器源码&#xff0c;带后台 测试正常分享&#xff0c;祝你使用愉快 弹幕后台、前置广告、暂停广告&#xff0c;记忆回放&#xff0c;自动下一集 支持&#xff1a;.m3u8、.mp4、.flv、等常见视频格式&#xff0c;兼容&#xff1a;电脑、手机端 源码截图&#xf…

【新手适用】手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN三: 如何验证和测试模型

【新手适用】手把手教你从零开始实现一个基于Pytorch的卷积神经网络CNN二&#xff1a; 如何训练模型&#xff0c;内附详细损失、准确率、均值计算-CSDN博客 从零开始实现一个基于Pytorch的卷积神经网络 - 知乎 (zhihu.com) 1 初始化、导入模型和数据集 新建一个test.py文件&a…

基于springboot+vue+Mysql的火车订票管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

uniapp 开发之原生Android插件

开发须知 在您阅读此文档时&#xff0c;我们假定您已经具备了相应Android应用开发经验&#xff0c;使用Android Studio开发过Android原生。也应该对HTML,JavaScript,CSS等有一定的了解, 并且熟悉在JavaScript和JAVA环境下的JSON格式数据操作等。 为了插件开发者更方便快捷的开…

pyside6/pyqt5/pyside2/pyqt6绘制图形

虽然可以在 PySide6 中嵌入 matplotlib 图&#xff0c;但这种体验并不完全是原生的。对于简单且高度交互的绘图&#xff0c;您可能需要考虑改用 PyQtGraph。PyQtGraph 建立在 PySide6 原生 QGraphicsScene 之上&#xff0c;提供更好的绘图性能&#xff0c;特别是对于实时数据&a…

试过了,ChatGPT确实不用注册就可以使用了!

看到官网说不用登录也可以直接使用ChatGPT 我们来试一下 直接打开官网 默认是直接进入了chatgpt3.5的聊天界面 之前是默认进的登录页面 聊一下试试 直接回复了&#xff0c;目前属于未登录状态&#xff0c;挺好&#xff01; 来试下ChatGPT4 跳转到了登录页面 目前来看gpt4还…

HTML常用文本标签以及注释文本

目录 前言: 1.标题标签&#xff1a; 前言&#xff1a; 实践&#xff1a; 总结&#xff1a; 2.段落标签&#xff1a; 前言&#xff1a; 段落中的空格&#xff1a; 总结: 3.文本格式化标签&#xff1a; 前言: 和标签的区别: 和标记之间的区别: 总结&#xff1a; 4.如…

go入门到精通

初识Go语言 Go语言介绍 Go语言是什么 2009年11月10日&#xff0c;Go语言正式成为开源编程语言家庭的一员。 Go语言&#xff08;或称Golang&#xff09;是云计算时代的C语言。Go语言的诞生是为了让程序员有更高的生产效率&#xff0c;Go语言专门针对多处理器系统应用程序的编…

Spring面试常见问题

目录 1、为什么要用Spring框架&#xff1f;2、有了spring为什么又出现了 springboot&#xff1f;3、springboot出现后为什么又出现了spring cloud&#xff1f;4、SpringBoot自动配置&#xff08;重点&#xff09;5、SpringBoot启动流程&#xff08;重点&#xff09;6、简单谈一…

在Linux中创建新用户的三种方法,总有一种适合你

将用户添加到Linux计算机是一项基本的管理任务,有几种方法可以实现这一点。每种创建用户的方法都有优点和缺点,我们将向你介绍三种不同的用户创建方法。 Linux计算机为什么需要用户 一台没有用户的个人计算机用处并不大。Linux支持多个用户。无论他们是同时登录并共享计算机…

PostgreSQL PGCA/PGCE/PGCM包通过率

PostgreSQL认证课程一共分为三个等级&#xff08;PGCA-PGCE-PGCM&#xff09;&#xff0c;特别注意&#xff1a;参加认证须有同级别合格培训记录&#xff0c;且不可跳级报考 PGCA-PGCE-PGCM都是线上考试&#xff0c;每两个月一次全国统考&#xff0c;详细考试时间可以参考下方表…

github拉取的项目添加至自己的仓库

想把GitHub的开源项目拉到本地进行二开&#xff0c;研究了一下上传到gitee的步骤&#xff1a; 步骤 gitee新建仓库&#xff0c;仓库名与本地文件夹的名称一致&#xff0c;建好后gitee的页面也会有显示git命令 打开项目目录&#xff0c;右键打开git bash&#xff08;或者在gi…

照片改格式怎么改?这两种方法帮你解决

不同的平台和应用程序可能对照片格式有不同的要求&#xff0c;将照片转换为适当的格式可以确保它们在网页、社交媒体、聊天应用等上加载和显示良好&#xff0c;常见的网络可接受的照片格式包括jpg、png和webp&#xff0c;那么怎么去将照片改格式呢?下面介绍几个比较简单的方法…

C# WPF编程-元素绑定

C# WPF编程-元素绑定 将元素绑定到一起绑定表达式绑定错误绑定模式代码创建绑定移除绑定使用代码检索绑定多绑定绑定更新绑定延时 数据绑定是一种关系&#xff0c;该关系告诉WPF从源对象提取一下信息&#xff0c;并用这些信息设置目标对象的属性。目标属性始终是依赖项属性&…

oracle19c安装-aarch64

建议 参考oracle官方文档提供的软硬件要求 https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/operating-system-checklist-for-oracle-database-installation-on-linux.html#GUID-E5C0A90E-7750-45D9-A8BC-C7319ED934F0 建议使用OracleLinux8.6及以上操作…

数据结构:非比较排序

非比较排序都具有很大的局限性,包括技术排序,基数排序,桶排序等 计数排序 时间复杂度:O(N) 空间复杂度:O(range) 适用范围 数据的范围集中的数组进行排序,不适合数据分散的数组 方法 统计每个数据出现的次数为n 建立一个相同大小的数组,将每个数据都初始化为0 然后遍历…

niushop单商户V5多店版源码分享三端uniapp打包方法包括PC端_小程序或h5端打包_收银端打包_APP端打包_商户端

目前多店版有四端uniapp&#xff0c;包括PC端uniapp&#xff0c;商家端uniapp&#xff0c;收银端uniapp&#xff0c;门店手机端uniapp&#xff0c;下面我总结下这些端的打包流程希望能帮助到大家&#xff0c;需要交流的可以看我昵称或者点我头像关注我分享代码和教程 一.niush…

【微众银行笔试题汇总】 2024-03-31-微众银行春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是KK爱Coding &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新微众银行近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&…

Java面试必问题24:线程池的拒绝策略有哪些 synchronized 和 lock 的区别 (重点)

以上列出的是Java线程池中常见的拒绝策略&#xff0c;具体可以根据实际情况选择合适的拒绝策略&#xff0c;也可以自定义实现RejectedExecutionHandler接口来定义自己的拒绝策略。默认的拒绝策略是AbortPolicy&#xff0c;即直接抛出异常。 最简回答&#xff1a;线程池的拒绝策…