leetcode5. 最长回文子串(Manacher - java)

Manacher回文算法

  • leetcode5. 最长回文子串
    • Manacher 算法
  • manacher 算法

leetcode5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。

示例 2:
输入:s = “cbbd”
输出:“bb”

提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成

Manacher 算法

介绍下Manacher算法:
Manacher 算法是一种用于寻找最长回文子串的算法。它的时间复杂度为 O(n),其中 n 是字符串的长度。以下是 Manacher 算法的基本步骤:

  1. 初始化一个字符串,其中包含一个长度为 n+1 的回文串,以使得字符串的中间字符为字符串的中间字符,例如:P=“banana”。
  2. 找到字符串 P 的中心字符,将其标记为 center。
  3. 从字符串的两端开始遍历 P,对于每个字符,如果其与 center 的距离大于字符串的长度的一半,则将该字符移动到与 center 对齐的位置,即将其插入到 P 中相应位置。
  4. 在 P 中找到最长的回文子串的右边界 max_right,左边界为 center。
  5. 对于每个字符,如果其与 center 的距离小于等于 max_right 与 center 的距离减去 1,则将该字符的回文半径(即该字符与 center 的距离减去 max_right 与 center 的距离)加入到一个栈中。
  6. 遍历栈中的回文半径,对于每个半径 r,如果其左侧有一个半径为 r-1 的回文子串,则可以扩展该回文子串,直到其与 center 的距离为 r。
  7. 最终得到的字符串就是原字符串的最长回文子串。

Manacher 算法的关键在于利用回文串的特性,将字符串中的字符移动到合适的位置,以便于后续的回文子串的扩展。

manacher 算法只用于计算回文字符串,都是固定代码,
因此直接看代码吧.

在这里插入图片描述

代码演示

class Solution {public String longestPalindrome(String s) {return manacher(s);}public static String manacher(String s){if (s == null || s.length() == 0){return null;}char[] str = manacherString(s);int R = -1;int C = -1;int[] pArr = new int[str.length];int max = Integer.MIN_VALUE;int pos = 0;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;}if (max < pArr[i]){pos = i;max = pArr[i];}}StringBuilder stringBuilder = new StringBuilder();for (int i = pos - max + 1; i < pos + max; i++){if (str[i] != '#'){stringBuilder.append(str[i]);}}return stringBuilder.toString();}public static char[] manacherString(String s){char[] chars = s.toCharArray();int index = 0;char[] manacher = new char[chars.length * 2 + 1];for (int i = 0; i < manacher.length;i++){manacher[i] = (i & 1) == 0 ? '#' : chars[index++];}return manacher;}
}

manacher 算法

Manacher算法 – 回文长度算法

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

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

相关文章

NestJS 的 中间件 学习

基本概念 中间件是在路由处理程序之前调用的函数。中间件函数可以访问请求和响应对象。在程序中我们可以让多个中间件串起来一起使用&#xff0c;当多个中间件一起使用时我们可以使用next()调用下一个中间件。 中间件主要是可以实现如下功能&#xff1a; 执行任何代码更改请…

CentOS7.9.离线安装Docker

CentOS 7上离线安装Docker 下载适用于CentOS 7的Docker安装包&#xff1a; https://download.docker.com/linux/static/stable/x86_64/将下载的 docker-24.0.4.tgz 文件上传到CentOS 7系统。例如&#xff0c;可以上传到 /root 目录下。 解压 docker-24.0.4.tgz 文件&#xff…

搭建关键字驱动自动化测试框架

前言 上篇文章我们已经了解到了数据驱动自动化测试框架是如何构建和驱动测试的&#xff01;那么这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架&#xff0c;它也被称为表格驱动测试或者基于动作字的测试…

Windows10 下 Neo4j1.5.8 安装教程

前言 Neo4j 是一个高性能的、NOSQL 图形数据库&#xff0c;它将结构化数据存储在网络上而不是表中。基于磁盘的、具备完全的事务特性的 Java 持久化引擎&#xff0c;这里就不把他和常用关系型数据库做对比了。因为篇幅有限&#xff0c;我这里也是第一次使用&#xff0c;所以以…

elasticsearch报错问题

标题1.报错问题 标题2.新建一个配置类 package cn.itcast.hotel.config;import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import o…

【Linux】Tcp协议的通讯流程,浅谈三次握手四次挥手

文章目录 Tcp协议的通讯流程一、协议定制与网络版计算器的实现二、json的使用总结 Tcp协议的通讯流程 上一篇文章我们讲解了如何实现Tcp服务器&#xff0c;Tcp的接口也用了&#xff0c;下面我们就看一下Tcp协议的通讯流程&#xff1a; 在服务端&#xff0c;我们首先要创建一个…

电脑C盘空间大小调整 --- 扩容(扩大/缩小)--磁盘分区大小调整/移动

概述&#xff1a; 此方法适合C盘右边没有可分配空间&#xff08;空闲空间&#xff09;的情况&#xff0c;D盘有数据不方便删除D盘分区的情况下&#xff0c;可以使用傲梅分区助手软件进行跨分区调整分区大小&#xff0c;不会损坏数据。反之可直接使用系统的磁盘管理工具进行调整…

Flutter学习—— Vscode创建项目

目录 一、Vscode创建项目 二、补充五种项目类型 Application: Module 模块开发&#xff0c; Package开发 Plugin 插件开发 Skeleton 骨架开发 一、Vscode创建项目 1.快捷键 CtrlShiftP 打开命令面板&#xff0c;选择新项目 2.选择需要开发的项目类型 Application 应用开…

39岁硕士找工作因年龄被卡?招聘单位否认

年龄限制问题在求职市场中是一个备受关注的话题。 近日&#xff0c;一位39岁的硕士徐先生在求职过程中遇到了年龄限制的问题&#xff0c;这一经历引发了人们对于年龄限制的探讨。 我们先来明确一下年龄限制的含义。 年龄限制是指在一些职业或领域中&#xff0c;对于应聘者的年龄…

Python代码片段之Django静态文件URL的配置

首先要说明这段python代码并不完整&#xff0c;而且我也没有做过测试&#xff0c;只是我在工作时参考了其中的一些个方法。这是我在找python相关源码资料里看到的一段代码&#xff0c;是Django静态文件URL配置代码片段2&#xff0c;代码中有些方法还是挺技巧的&#xff0c;做其…

Tomcat 的使用(图文教学)

Tomcat 的使用&#xff08;图文教学&#xff09; 前言一、什么是Tomcat&#xff1f;二、Tomcat 服务器和 Servlet 版本的对应关系三、Tomcat 的使用1、安装2、目录介绍3、如何启动4、Tomcat 的停止5、如何修改 Tomcat 的端口号6、如何部暑 web 工程到 Tomcat 中6.1 方式一6.2 …

红队打靶:Nullbyte打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现与端口扫描 第二步&#xff1a;Web渗透 第三步&#xff1a;hydra密码爆破 第四步&#xff1a;SQL注入大赏 方法一&#xff1a;手工SQL注入之联合查询 方法二&#xff1a;SQL注入写入一句话木马 方法三&#xff1a;SQL注入写入…

C语言学习笔记 VScode设置C环境-06

目录 一、下载vscode软件 二、安装minGW软件 三、VS Code安装C/C插件 3.1 搜索并安装C/C插件 3.2 配置C/C环境 总结 一、下载vscode软件 在官网上下载最新的版本 Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download 二、安装minGW…

测试覆盖率 JVM 字节码测试运用 - 远程调试、测试覆盖、影子数据库

目录 前言&#xff1a; 简介 基础使用方式介绍 工具特性 前言&#xff1a; 在软件开发中&#xff0c;测试覆盖率是一个非常重要的指标&#xff0c;它表示代码中所有的测试用例是否都已经被覆盖到。JVM 字节码测试是一种比较新的测试方法&#xff0c;它可以对 JVM 字节码进…

托管和非托管 Kubernetes 管理平台详解(第一部分)

托管和非托管 Kubernetes 管理平台分别有哪些优势和不足&#xff1f;我们将通过两篇文章进行详细介绍&#xff0c;帮助您选择更适合自身需求的平台。 首先&#xff0c;让我们了解一下托管的 Kubernetes 管理平台&#xff08;KMP&#xff09;。 托管的 KMP 托管 Kubernetes 管…

FFMPEG源码之ffmpeg.c解析

重要函数解析 main()ffmpeg_parse_options()transcode() main() int main(int argc, char **argv) {int ret;BenchmarkTimeStamps ti;/* 初始化动态加载 */init_dynload();/* 注册退出回调函数 */register_exit(ffmpeg_cleanup);/* 设置stderr的缓冲模式&#xff08;win32运行…

【运动规划算法项目实战】TABV代码解析(五):plan_manage

文章目录 前言一、FastPlannerManager.h1.1 成员变量:二、KinoReplanFSM.h2.1 成员变量2.2 方法三、plan_container.hpp3.1 成员变量:3.2 实现方法:四、backward.hpp五、fast_planner_node.cpp六、kino_replan_fsm.cpp七、planner_manager.cpp八、traj_server.cpp九、总结前言…

nlp系列(6)文本实体识别(Bi-LSTM+CRF)pytorch

模型介绍 LSTM&#xff1a;长短期记忆网络&#xff08;Long-short-term-memory&#xff09;,能够记住长句子的前后信息&#xff0c;解决了RNN的问题&#xff08;时间间隔较大时&#xff0c;网络对前面的信息会遗忘&#xff0c;从而出现梯度消失问题&#xff0c;会形成长期依赖…

Elasticsearch 一段时间后出现 SocketTimeoutException的问题

java springboot 使用ES客户端连接 一段时间闲置后&#xff0c;首次调用es命令会报SocketTimeOutException问题&#xff0c;再次调用不会报错 问题出现原因&#xff1a; Elasticsearch 客户端会根据服务器返回的HTTP报文内容&#xff0c;来决定客户端保持HTTP连接Keep-Alive…

开源项目注意事项

fork项目后&#xff0c;记得另外开启一个分支然后在新分支上进行开发&#xff0c;push到仓库后从分支往原项目提交。 否则会出现Partially verified&#xff08;导致提交pr后auto-merge失败&#xff09; 注意git提交操作 https://blog.csdn.net/sonichenn/article/details/13…