Manacher算法(马拉车)

Manacher(马拉车)算法

作用:在On的时间复杂度下,求出字符串每个回文中心的最长回文半径

回文半径:以回文中心为起点,到回文串两端的距离

如:# a # b # a #

以b为回文中心,最长回文半径就是 4(可以根据个人习惯选择是否将回文中心包括)

如果回文字符串长度为偶数,那么回文中心就无法正好落在某个字符上,所以可以在每个字符之间添加一个“#”做前置处理(包括字符串首尾)

对于求一个字符串中每个字符的最长回文半径,暴力做法是使用两层循环遍历字符串的每个字符,以遍历到的字符为中心向两边扩散:

public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s = br.readLine();s = getNew(s);//每个位置的最长回文半径int[]r = new int[s.length()];for (int i = 0;i < s.length();i++) {while (i-r[i] >= 0 && i+r[i] < s.length() &&s.charAt(i - r[i]) == s.charAt(i + r[i])) r[i]++;}for (int i = 0; i < s.length(); i++) {System.out.print(s.charAt(i)+" ");}System.out.println();for (int i = 0; i < s.length(); i++) {System.out.print(r[i]+" ");}}public static String getNew(String str) {String s = "#";for (int i = 0;i < str.length();i++) {s += str.charAt(i) + "#";}return s;}
}

思路

利用回文串的对称性,和之前遍历过的已知的回文串,减少中心扩散的次数,这里我们要维护一个使区间右端最靠右的区间

设有字符串S,S的l到r区间是回文串,mid为回文中心,现要求以i为回文中心的最长回文半径

i在区间 [ l , r ] 内:

j为i关于mid的对称点,那么:

  • 以 j 为中心的回文串在 [ l , r] 内
    在这里插入图片描述

    易知,r [ i ] = r [ j ]

  • 以 j 为中心的回文串有部分在[ l , r ] 外
    在这里插入图片描述

    r [ j ] 中超出 l 的那部分肯定和 r 右边不同,所以,r [ i ] = j - l + 1 = r - i + 1

  • 以 j 为中心的回文串左边界与 l 重合
    在这里插入图片描述

    这时,r [ i ] 是可以大于 r [ j ] 的,就要用中心扩散来接着求 r [ i ]

i在区间 [ l , r ] 外:

这时只能用中心扩散来求 r [ i ]

示例:洛谷:P3805 【模板】manacher

求最大回文子串长度

import java.io.*;public class Main{static final int N = 22000005;public static void main(String[]args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String s = br.readLine();char[]c = s.toCharArray();char[]sc = new char[N];int[]d = new int[N];sc[0] = '#';int cnt = 0;for(int i = 0;i < c.length;i++) {sc[++cnt] = c[i];sc[++cnt] = '#';}int r = 0,len = 0,mid = 0;for(int i = 1;i < cnt;i++) {if(i <= r) d[i] = Math.min(d[(mid << 1) - i],r - i + 1);else d[i] = 1;while(i - d[i] >= 0 && sc[i+d[i]] == sc[i - d[i]]) d[i]++;//维护最靠右区间if(i + d[i] - 1 > r) {mid = i;r = i + d[i] - 1;}//这里d[i] - 1是将子串中的‘#’去掉的长度len = Math.max(len,d[i] - 1);}System.out.println(len);}
}

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

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

相关文章

windows安装conda小环境 windows安装anaconda python jupyter anaconda

windows安装anaconda之后&#xff0c;再安装本地的jupyter 1 如果想体验在线版的jupyter&#xff0c;可以访问anaconda在Anaconda Cloud&#xff0c;需要注册github&#xff1a; 1 下载anaconda &#xff0c;并安装 1.1 下载 或者去清华镜像下载 Free Download | Anacondah…

python案例教程,python简单案例

这篇文章主要介绍了python案例教程&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 据说Python之父-Guido Van Rossum打算让CPython更快&#xff0c;速度直接翻五倍&#xff0c…

C# Tcplistener,Tcp服务端简易封装

文章目录 前言相关文章前言设计代码简单使用运行结果 前言 我最近有个需求要写Tcp服务端&#xff0c;我发现Tcp服务端的回调函数比较麻烦&#xff0c;简化Tcp的服务&#xff0c;我打算自己封装一个简单的Tcp服务端。 相关文章 C# TCP应用编程三 异步TCP应用编程 C# Tcpclient…

Linux本地搭建StackEdit Markdown编辑器结合内网穿透实现远程访问

文章目录 1. docker部署Stackedit2. 本地访问3. Linux 安装cpolar4. 配置Stackedit公网访问地址5. 公网远程访问Stackedit6. 固定Stackedit公网地址 StackEdit是一个受欢迎的Markdown编辑器&#xff0c;在GitHub上拥有20.7k Star&#xff01;&#xff0c;它支持将Markdown笔记保…

【MATLAB第83期】基于MATLAB的LSTM代理模型的SOBOL全局敏感性运用

【MATLAB第83期】基于MATLAB的LSTM代理模型的SOBOL全局敏感性运用 引言 在前面几期&#xff0c;介绍了敏感性分析法&#xff0c;本期来介绍lstm作为代理模型的sobol全局敏感性分析模型。 【MATLAB第31期】基于MATLAB的降维/全局敏感性分析/特征排序/数据处理回归问题MATLAB代…

Lazada商品详情API在电商中的价值及实时数据获取实践

一、引言 在电商行业&#xff0c;数据是驱动业务增长的关键。Lazada作为东南亚地区知名的电商平台&#xff0c;其商品详情API对于电商行业具有深远的影响。本文将探讨Lazada商品详情API在电商行业中的重要性&#xff0c;并介绍如何实现实时数据获取。 二、Lazada商品详情API的…

基于Java SSM框架实现高校信息资源共享平台系统【项目源码+论文说明】

基于java的SSM框架实现高校信息资源共享平台系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们…

部署threestudio | stable zero123

stable zero123的官网https://huggingface.co/stabilityai/stable-zero123 选择我在autodl的stable-zero123这个镜像&#xff0c;或者直接选这个基础环境 开机后切换到conda的base环境 这里注意一点就是目前stable-zero123这个镜像还没解决的问题&#xff0c;就是没法使用xfo…

大数据机器学习:从理论到实战,探索学习率的调整策略

大数据机器学习&#xff1a;从理论到实战&#xff0c;探索学习率的调整策略 全文目录 大数据机器学习&#xff1a;从理论到实战&#xff0c;探索学习率的调整策略一、引言二、学习率基础定义与解释学习率与梯度下降学习率对模型性能的影响 三、学习率调整策略常量学习率时间衰减…

时代变了,100多张报表自动生成,不用开发!

十多年老IT&#xff0c;现任职某大厂 毫不客气地说&#xff0c;别看某大厂看起来各种的高大上&#xff0c;其实内在信息化简直就是一团乱账&#xff0c;业务数据多&#xff0c;但都被按照不同指标和存储方式放在各自系统中&#xff1b;业务系统多&#xff0c;但数据孤岛严重&a…

【Unity】运行时创建曲线(贝塞尔的运用)

[Unity]运行时创建线&#xff08;贝塞尔的运用&#xff09; 1. 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线。 2. 原理介绍 2.1 曲线的创建 unity建立网格曲线可以参考Unity程序化网格体的实现方法。主要分为顶点&#xff0c;三角面&#xff0c…

基于ssm餐饮掌上设备点餐系统论文

餐饮掌上设备点餐系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了餐饮掌上设备点餐系统的开发全过程。通过分析餐饮掌上设备点餐系统管理的不足&#xff0c;创建了一个计算机管理餐饮掌上设备点餐系统的…