Manacher算法(马拉车)

2023-12-19

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);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Manacher算法(马拉车) 的相关文章

  • 带路径压缩算法的加权 Quick-Union

    有一种 带路径压缩的加权快速联合 算法 代码 public class WeightedQU private int id private int iz public WeightedQU int N id new int N iz new
  • Java Logger 未记录到 Netbeans 中的输出

    我正在 Netbeans 中使用 Maven 启动一个 Java 项目 我编写了一些代码来使用 Logger 类进行日志记录 但是 日志记录似乎不起作用 在程序开始时 我运行 Logger getLogger ProjectMainClas
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 在 Java 中如何找出哪个对象打开了文件?

    我需要找出答案哪个对象在我的 Java 应用程序中打开了一个文件 这是为了调试 因此欢迎使用工具或实用程序 如果发现哪个对象太具体了 这class也会很有帮助 这可能很棘手 您可以从使用分析器开始 例如VisualVM http visua
  • 如何检查某个元素是否存在于一组项目中?

    In an ifJava中的语句如何检查一个对象是否存在于一组项目中 例如 在这种情况下 我需要验证水果是苹果 橙子还是香蕉 if fruitname in APPLE ORANGES GRAPES Do something 这是一件非常微
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • Java Applet 中的 Apache FOP - 未找到数据的 ImagePreloader

    我正在研究成熟商业产品中的一个问题 简而言之 我们使用 Apache POI 库的一部分来读取 Word DOC 或 DOCX 文件 并将其转换为 XSL FO 以便我们可以进行标记替换 然后 我们使用嵌入到 Java 程序中的 FOP 将
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • 如何区分从 Saxon XPathSelector 返回的属性节点和元素节点

    给定 XML
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • 在java中以原子方式获取多个锁

    我有以下代码 注意 为了可读性 我尽可能简化了代码 如果我忘记了任何关键部分 请告诉我 public class User private Relations relations public User relations new Rela
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似

随机推荐

  • 解决adb传文件中文名问题

    echo off setlocal enabledelayedexpansion REM 路径后面记得不要加斜杠 set 目标路径 sdcard 01tmp echo 目标路径 目标路径 echo set 有连接 False for F t
  • Python Faker库:生成大量测试数据的强大工具

    在软件开发过程中 测试数据扮演着重要的角色 它不仅可以帮助开发者验证代码的正确性 还可以帮助测试人员进行压力测试和性能测试 然而 手动生成大量的测试数据是一项繁琐且耗时的任务 幸运的是 Python的Faker库提供了一种简单而高效的方法来
  • Redis设计与实现之慢查询日志

    目录 一 慢查询日志 1 相关数据结构 2 慢查询日志的记录 3 慢查询日志的操作 4 如何设置慢查询的阈值 5 如何查看慢查询日志的内容 6 如何分析慢查询日志以找出性能瓶颈 7 如何优化慢查询以提高Redis的性能 8 慢查询日志对Re
  • 华为OD机试 C++【最大载货量】

    描述 在火车站旁的货运站 小明负责调度2K辆中转车 其中K辆用于干货 K辆用于湿货 每批到站的货物来自不同的供货商 需要按照顺序装入中转车 注意 一个供货商的货物只能装在一辆车上 不能分开 但是 一辆车可以放多个供货商的货物 问题是 要让所
  • C++图形输出(慧通教育题库、一本通启蒙题库)

    第10关 课程F 二重循环应用1 1002 星号矩阵 课程F 登录 1003 星号三角形 课程F 登录 1004 星号三角形2 课程F 登录 1005 星号正方形 课程F 登录 1006 星号金字塔 课程F 登录 1007 星号平行四边形
  • 基于springboot+vue的奶茶店在线管理系统

    博主介绍 全网个人号和企业号 粉丝40W 每年辅导几千名大学生较好的完成毕业设计 专注计算机软件领域的项目研发 不断的进行新技术的项目实战 热门专栏 推荐订阅 订阅收藏起来 防止下次找不到 千套JAVA项目实战持续更新中 百套小程序APP项
  • Linux: sysctl: network: ip_no_pmtu_disc,容易搞混的参数名称

    这个参数的迷惑性在于双重否定 字面意思是关闭PMTU发现的功能 如果设置为1 代表关闭 如果是0 代表不关闭pmtu发现的功能 所以说明里 有disable enable 就容易搞混 所以要甄别网上的某些博客的说明 不要被误导 ip no
  • 硬件基础-电容

    电容 本质 电容两端电压不能激变 所以可以起到稳定电压作用 充放电 电容量的大小 想使电容容量大 使用介电常数高的介质 增大极板间的面积 减小极板间的距离 品牌 国外 村田 muRata 松下 PANASONIC 三星 SAMSUNG 太诱
  • 测试进程监控:确保产品质量的关键

    引言 在软件开发过程中 测试是确保产品质量的重要环节 为了提高测试效率和准确性 测试进程监控成为了不可或缺的工具 本文将介绍测试进程监控的各个方面 包括产品风险度量 缺陷度量源 测试用例 或规程 度量 测试覆盖率度量 风险覆盖率以及度量的使
  • U-Net 算法详解

    目录 1 任务概述 2 编码器 解码器 3 跳跃连接 4 实现细节 5 损失函数 6 上采样方法 不填充还是填充 7 U Net 的运作方式 8 结论 1 任务概述 U Net 是为语义分割任务开发的 当神经网络接受图像作为输入时 我们可以
  • 【map】【单调栈 】LeetCode768: 最多能完成排序的块 II

    作者推荐 贪心算法 中位贪心 执行操作使频率分数最大 涉及知识点 单调栈 排序 map 区间合并 题目 给你一个整数数组 arr 将 arr 分割成若干 块 并将这些块分别进行排序 之后再连接起来 使得连接的结果和按升序排序后的原数组相同
  • 【具身智能评估9】Open X-Embodiment: Robotic Learning Datasets and RT-X Models

    论文标题 Open X Embodiment Robotic Learning Datasets and RT X Models 论文作者 论文原文 https arxiv org abs 2310 08864 论文出处 论文被引 12 1
  • SpringBoot中华非遗传承网站 毕业设计-附源码48408

    SpringbootSpringboot中华非遗传承网站 摘 要 非物质文化遗产是人类智慧活动的结晶 具有极高的文化价值 是一个民族历史文化的时间遗迹 我国拥有三千多年的历史文明 在非物质文化遗产的数量和质量上 在世界当中都是首屈一指的 根
  • springboot高校基础类课程公告答疑平台 计算机毕设源码32747

    目 录 摘要 1 绪论 1 1研究背景 1 2国内外研究慨况 1
  • 【分布式算法】Gossip协议详解

    一 为什么需要 Gossip 协议 为了实现 BASE 理论中的 最终一致性原则 两阶段提交协议和 Raft 算法需要满足 大多数服务节点正常运行 原则 如果希望系统在少数服务节点正常运行的情况下 仍能对外提供稳定服务 这时就需要实现最终一
  • 微信小程序基本结构

    这里写自定义目录标题 文件目录结构 创建一个页面 新建一个小程序项目 搭建目录结构 搭建项目页面 引 字体图标 搭建项 tabbar结构 标签初始化 自定义组件 声明一个自定义组件
  • 基于html5的国家历史文物网站的设计与实现-计算机毕业设计源码63653

    目 录 摘 要 Abstract 第 1 章
  • 基于Spring Boot旅游景点订票系统设计与实现-计算机毕业设计源码68524

    摘 要 科技进步的飞速发展引起人们日常生活的巨大变化 电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用 信息时代的到来已成为不可阻挡的时尚潮流 人类发展的历史正进入一个新时代 在现实运用中 应用软件的工作规则和开发步
  • springboot+mysql宠物领养系统-计算机毕业设计源码46903

    目 录 摘要 1 绪论 1 1 意义 1 2
  • Manacher算法(马拉车)

    Manacher 马拉车 算法 作用 在On的时间复杂度下 求出字符串每个回文中心的最长回文半径 回文半径 以回文中心为起点 到回文串两端的距离 如 a b a 以b为回文中心 最长回文半径就是 4 可以根据个人习惯选择是否将回文中心包括