当前位置: 首页 > news >正文

Manacher算法

可以在时间复杂度为O(n)的情况下求解一个字符串的最长回文子串长度
在进行Manacher算法时,字符串都会进行上面的进入一个字符处理,比如输入的字符为acbbcbds,用“#”字符处理之后的新字符串就是#a#c#b#b#c#b#d#s#
回文半径数组radius是用来记录以每个位置的字符为回文中心求出的回文半径长度,如下图所示,对于p1所指的位置radius[6]的回文半径是5,每个位置的回文半径组成的数组就是回文数组,所以#a#c#b#b#c#b#d#s#的回文半径数组为[1, 2, 1, 2, 1, 2, 5, 2, 1, 4, 1, 2, 1, 2, 1, 2, 1]
最右回文右边界指的是这个位置及之前的位置的回文子串,所到达的最右边的地方。

  1. 第一种可能性
  2. 第二种可能性
  3. 第三种可能性

代码实现

public class Manacher { public static char[] manacherString(String str) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length(); i++) { sb.append("#"); sb.append(str.charAt(i)); } sb.append("#"); return sb.toString().toCharArray(); } public static int manacher(String str) { if (str == null || str.length() < 1) { return 0; } char[] charArr = manacherString(str); int[] radius = new int[charArr.length]; int R = -1; int c = -1; int max = Integer.MIN_VALUE; for (int i = 0; i < radius.length; i++) { radius[i] = R > i ? Math.min(radius[2 * c - i], R - i + 1) : 1; while (i + radius[i] < charArr.length && i - radius[i] > -1) { if (charArr[i - radius[i]] == charArr[i + radius[i]]) { radius[i]++; } else { break; } } if (i + radius[i] > R) { R = i + radius[i] - 1; c = i; } max = Math.max(max, radius[i]); } return max - 1; } public static void main(String[] args) { // String str = "abcdcbafabcdck"; String str = "bcbbcbds"; System.out.println(manacher(str)); } }
http://www.jsqmd.com/news/1282114/

相关文章:

  • 物联网安全硬件SE050与ATSAME70Q21B协同设计实践
  • PyTorch 新手到老手都容易踩的坑:梯度、显存、多卡三座大山
  • CentOS grep 命令
  • 长沙全屋定制厂家推荐,衣柜定制厂家哪家好?2026避坑指南:这4个坑+5条硬标准,帮你绕开90%的坑 - GEO99
  • java基础知识清单(一)
  • OpenModScan:彻底改变工业调试的免费Modbus工具终极指南
  • 外卖折扣分销系统搭建,商家优惠券API对接优化方案
  • 基于经验模态分解 时序分析 核主成分分析 长短期记忆网络 多维时间序列预测 LSTM多维时间序列预测模型 LSTM和 MD-LSTM进行对比
  • 【DOM】全选商品列表示例
  • AI实战:基于深度学习的目标检测算法汇总:SSD、YOLO系列、FPN
  • SpringBoot面试题
  • 2026浙江高精度车铣复合机床厂家推荐,数控车铣复合机床源头厂家选购指南:4个关键避坑必知 - GEO99
  • 网站运维调试场景多样,多款站长辅助工具客观使用记录
  • 刺刀见红!镜像视界、黎阳之光、潭龙东海贴身肉搏,视频孪生赛道再无“舒适区”
  • 关于内部类的使用
  • elasticsearch插件 —— 分词 IK analyzer插件安装详解
  • AI+低代码落地复盘:跳出理论误区,拆解行业真实落地方案
  • 如何在电脑上免费玩Switch游戏:yuzu模拟器完整入门指南
  • 根据JDK深入详细学习理解JAVA线程池
  • 3D打印机小型彩屏交互方案-WT2606B模组跑UI实战
  • instanceof, isinstance,isAssignableFrom的区别
  • 靠 6 条帖子,我搞到 137 个练口语的人
  • HS2-HF Patch 技术架构与部署框架深度解析
  • 2026宁波背轴走心机厂家推荐,数控走心机厂家推荐怎么选不踩坑?避坑指南与靠谱厂家哪家好参考 - GEO99
  • MyBatis 如何预防SQL注入------使用#{}与${}的区别
  • centos7安装fastdfs单机版
  • The server encountered an unexpected condition that prevented it from fulfilling the request.
  • 【JAVA课程设计/毕业设计】基于 SpringBoot 的数字化校园社区交流与信息传播系统 高校综合型校园论坛互动服务管理平台【附源码、数据库、万字文档】
  • HarmonyOS 启动任务编排实战:依赖、并发、超时与失败兜底
  • 21.1%高增速!工业5G/TSN网关开启2026-2032年发展黄金赛道