数据结构-manacher算法

news2024/9/24 13:22:36

在这里插入图片描述

第一种情况: 以t为中心,他的回文串为abedeks, 同时i’的回文为ede,那么i的回文也是ede。
在这里插入图片描述

第二种情况:以s为中心的回文串为 tabkdedk,而以i’为中心的回文串为abkde,已不再L和R之间。此时以i为中心的回文串就为kdedk.

在这里插入图片描述

第三种情况: 以t为中心的回文串为 ebcbestsebcbe, 以i’为中心的串为ebcbe, c和i’的正好在L边界重叠。此时以i为中心的回文串可以直接从R处开始向右边继续比较。
在这里插入图片描述


public class Code_Manacher {
    public static void main(String[] args) {
        String s = "66666";
        char[] str = manacherString(s);
        System.out.println(str);
        System.out.println(manacher(s));
    }

    public static int manacher(String s){
        if(s == null || s.length() == 0){
            return 0;
        }

        // 将字符串用#填充
        char[] str = manacherString(s);
        // 回文半径数组,使用该数组来加速
        int[] pArr = new int[str.length];
        int R = -1;
        int C = -1;
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < str.length; i++) {
            pArr[i] = R > i ? Math.min(pArr[2*C-i], R-i) : 1;

            while(i + pArr[i] < str.length && i-pArr[i] > -1){
                if( str[i+pArr[i]] == str[i-pArr[i]] ){
                    pArr[i]++;
                }else{
                    break;
                }
            }

            if(i + pArr[i] > R){
                R = i + pArr[i];
                C = i;
            }

            max = Math.max(max,pArr[i]);
        }
        return max-1;
    }

    public static char[] manacherString(String str){

        char[] s = new char[str.length()*2+1];
        for (int i = 0; i <s.length; i++) {
            s[i] = (i%2 == 1 ? str.charAt(i/2) : '#');
        }
        return s;
    }

}

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

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

相关文章

书生大模型实战营第三期基础岛第六课——OpenCompass 评测 InternLM-1.8B 实践

OpenCompass 评测 InternLM-1.8B 实践 基础作业:创建虚拟环境下载并安装opencompass安装相关依赖复制测评数据集到当前目录下并解压测评前环境变量配置使用命令行配置参数法进行评测 基础作业: 使用 OpenCompass 评测 internlm2-chat-1.8b 模型在 ceval 数据集上的性能&#x…

强化学习,第 4 部分:蒙特卡洛控制

目录 一、介绍 1.1 强化学习 2.1 关于此文章 三、ε贪婪策略 四、蒙特卡洛控制 4.1 基本原理 4.2 举个例子 五、On-policy & off-policy 方法 六、重要性采样 6.1 赋予动机 6.2 想法 6.3 应用 七、增量实施 7.1 增量的理论 7.2 常α MC 八、结论 一、介绍 …

Livekit本地部署Egress录制服务

Livekit本地部署Egress录制服务 Egress官方推荐使用Docker方式部署。官方文档 创建Egress配置文件 新建config文件 vim config.yamlconfig.yaml文件内容 log_level: debug# api_key 参考livekit 部署 配置的 api_key: 2yJimTMFeF9h15PHEv api_secret: Mvi9ZgqGJ3LqwEAcTV…

项目管理的七大核心要素

项目管理不仅涉及一系列复杂的活动&#xff0c;还涵盖了多个关键要素&#xff0c;这些要素相互交织&#xff0c;共同构成了项目成功的基石。 项目管理七大要素&#xff1a; 1、明确的项目目标&#xff1a; 项目管理的起点是确立清晰、具体、可衡量的项目目标。这些目标不仅为…

新手网络爬虫利器介绍 之 移动蜂窝网络代理

移动蜂窝代理对接说明 在爬虫与反爬虫斗争愈演愈烈的情况下&#xff0c;各大网站和 App 的风控检测越来越强&#xff0c;其中一项就是 IP 封禁。 为了解决 IP 封禁的困扰&#xff0c;一个有效的方式就是设置代理&#xff0c;设置代理之后&#xff0c;爬虫可以借助代理的 IP 来…

IntelliJ IDEA 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 设置编辑器字体3. 设置编译软件整体字体 前言 IntelliJ IDEA 自定义字体大小&#xff0c;统一设置为 JetBrains Mono 具体操作 【File】>【Settings...】>【Editor】>【Font】 统一设置…

关于git报错please clean your repository working tree

在vscode中使用git拉取代码提示&#xff1a;在签出前&#xff0c;请清理存储库工作树。有时候在写代码前未更新远程代码&#xff0c;会出现代码冲突。 1.git stash 先将本地修改存储在暂存区2.git pull 拉取远程代码3.git stash pop 释放暂存区内容

书生大模型实战营-进阶关卡-6-MindSearch 快速部署

任务&#xff1a;将 MindSearch 部署到 HuggingFace 教程&#xff1a;https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/MindSearch/readme_github.md 环境配置 打开codespace主页https://github.com/codespacescodespace主页&#xff0c;选择blank template。 新…

turtlebot 测试 Gazebo Harmonic ROS Jazzy

源码移植后理论上支持所有Gazebo和ROS版本&#xff0c;但花费时间较多。 只推荐学习Gazebo 经典版和Gazebo Harmonic以及之后版本。 在中间的过渡版本&#xff0c;不推荐学习。 Gazebo经典版包括Gazebo 7 Gazebo 9 Gazebo 11。 Gazebo Harmonic 和 ROS2 jazzy 安装和测试-CSDN博…

核心数据加密的实现方式

核心数据加密是保护企业敏感数据和技术机密的重要手段&#xff0c;它通过加密算法和密钥将明文数据转换为难以解读的密文&#xff0c;以防止数据在存储、传输或使用过程中被未授权访问或泄露。以下是对核心数据加密的详细解析&#xff1a; 一、核心数据加密的重要性 在数字化时…

短视频SDK解决方案,原开发团队,一对一技术支持

美摄科技&#xff0c;作为行业领先的视频技术提供商&#xff0c;凭借深厚的技术积累和敏锐的市场洞察&#xff0c;隆重推出其短视频SDK解决方案&#xff0c;旨在为全球开发者及内容创作者搭建一座通往无限创意与高效生产的桥梁。 【一站式解决方案&#xff0c;赋能创意无界】 …

华裔二、三代长相变迁的多维度解析

华裔二、三代长相变迁的多维度解析http://www.rebootvip.com/wenzhang/3182.html 在全球化日益加深的今天&#xff0c;华裔二、三代的长相特征逐渐展现出与传统中国人形象不同的风貌&#xff0c;这一现象背后蕴含着丰富的生物学、文化、社会及个人层面的原因。以下是对此…

8.27练习

一.创建3个线程&#xff0c;一个子线程拷贝文件的前一半&#xff0c;一个子线程拷贝后一半文件 创建两个子线程分别负责拷贝文件的前半段和后半段&#xff0c;从而提高文件拷贝的效率。父线程负责创建和管理子线程&#xff0c;并等待它们完成任务。 #include <myhead.h>…

Golang | Leetcode Golang题解之第377题组合总和IV

题目&#xff1a; 题解&#xff1a; func combinationSum4(nums []int, target int) int {dp : make([]int, target1)dp[0] 1for i : 1; i < target; i {for _, num : range nums {if num < i {dp[i] dp[i-num]}}}return dp[target] }

如何使用 Pytest 进行测试

Pytest 是一个强大的Python测试框架&#xff0c;支持简单单元测试和复杂的功能测试。它具有灵活的断言表达式、支持参数化测试、强大的插件生态系统等特点。 二、环境搭建 1、安装 Pytest&#xff1a; pip install pytest安装完成后&#xff0c;可以通过命令行检查是否安装成…

锡废水回收实验

电镀厂的锡废水回收过程中&#xff0c;需要进行一系列实验以确保回收效率和环保标准。这些实验主要包括以下几个方面&#xff1a; 一、废水成分分析实验 目的&#xff1a;了解废水中锡及其他重金属、有机物、悬浮物等的含量和性质&#xff0c;为后续处理工艺提供依据。方法&am…

‌分布式计算技术与复杂算法优化:‌现代数据处理的基石

在当今信息时代&#xff0c;‌数据已成为企业和社会发展的核心资源。‌随着数据量的爆炸性增长&#xff0c;‌传统的单机计算模式已难以满足高效数据处理的需求。‌分布式计算技术应运而生&#xff0c;‌它通过将大规模计算任务分解成多个子任务&#xff0c;‌在多个计算节点上…

Docker Compose 部署 Kafka的KRaft模式 不用依赖 Zookeeper

前言 从 Kafka 2.8 开始&#xff0c;KRaft 模式允许 Kafka 在没有 Zookeeper 的情况下运行。本文将部署单机模式 1.新建 docker-compose.yml vim docker-compose.yml services:kafka:image: bitnami/kafka:3.6container_name: kafkaports:- "19092:9092"environm…

2024华为数通HCIP-datacom最新题库(H12-831变题更新⑩)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 1、…

SpringBoot整合SpringSecurity + JWT

SpringBoot整合SpringSecurity JWT 前置知识&#xff1a;Cookie&#xff0c;Session&#xff0c;Token Cookie&#xff0c;Session介绍 Cookie 、 Session 和 Token 是用于在 Web 应用程序中管理用户状态和身份验证的技术。因为在 Web 应用中&#xff0c; HTTP的通信是无状…