回文侦探:三种境界破解最长回文子串
回文侦探三种境界破解最长回文子串LeetCode 5. 最长回文子串—— 从暴力到线性看懂回文问题的三种解题境界。一、故事开场你是回文侦探想象你接到一个任务在一串字符里找出最长的镜像文字。比如babad里bab和aba都是回文 —— 正着读反着读都一样。你的目标是在所有回文子串中找到最长的那个。但字符串可能有 1000 个字符肉眼扫描不现实。这就是 LeetCode 第 5 题 ——最长回文子串。它看似简单却藏着三种截然不同的解法境界。二、暴力解法为什么不直接枚举最笨的方法枚举所有子串判断是不是回文。子串数量O(n2)O(n^2)O(n2)判断回文O(n)O(n)O(n)总时间O(n3)O(n^3)O(n3)面试官听了会摇头。我们需要更聪明的方法。三、解法一中心扩展法面试首选核心思路回文串有个特点它有一个中心两边对称。中心有两种可能1 个字符奇数长度如aba2 个字符偶数长度如abba所以遍历每个字符分别作为两种中心向两边扩展直到不再对称为止。下标: 0 1 2 3 4 字符: b a b a d ↑ i1中心 扩展: 左0, 右2 → bb ✅ 左-1, 右3 → 越界停 得到回文: bab长度 3代码实现classSolution{publicStringlongestPalindrome(Strings){if(snull||s.length()1)return;intstart0,end0;for(inti0;is.length();i){intlen1expand(s,i,i);// 奇数中心intlen2expand(s,i,i1);// 偶数中心intlenMath.max(len1,len2);if(lenend-start){starti-(len-1)/2;endilen/2;}}returns.substring(start,end1);}privateintexpand(Strings,intleft,intright){while(left0rights.length()s.charAt(left)s.charAt(right)){left--;right;}returnright-left-1;// 实际回文长度}}复杂度时间O(n2)O(n^2)O(n2)—— 每个中心最多扩展nnn次空间O(1)O(1)O(1)—— 只记录左右边界评价就像一个侦探从每个可能的中心点开始向两边展开推理。虽然要查nnn个中心点但每个案子都不复杂。四、解法二动态规划理解回文的本质核心思路中心扩展是从中间向两边看动态规划则是从小回文推大回文。定义dp[i][j]子串s[i..j]是否为回文串。状态转移s[i] ! s[j]→dp[i][j] false首尾不同肯定不是s[i] s[j]→ 看去掉首尾后是不是回文如果子串长度≤2\leq 2≤2如a或aa→ 直接为true否则dp[i][j] dp[i1][j-1]s abba dp[0][3]: s[0]a, s[3]a → 看 dp[1][2] dp[1][2]: s[1]b, s[2]b → 长度2 → true 所以 dp[0][3] true ✅遍历顺序很关键i必须从大到小因为依赖i1j从小到大。代码实现classSolution{publicStringlongestPalindrome(Strings){intns.length();if(n2)returns;boolean[][]dpnewboolean[n][n];intstart0,maxLen1;for(intin-1;i0;i--){for(intji;jn;j){if(s.charAt(i)s.charAt(j)){if(j-i2){dp[i][j]true;}else{dp[i][j]dp[i1][j-1];}}if(dp[i][j](j-i1)maxLen){maxLenj-i1;starti;}}}returns.substring(start,startmaxLen);}}复杂度时间O(n2)O(n^2)O(n2)空间O(n2)O(n^2)O(n2)—— 需要二维数组评价就像建立一个回文档案库把每个小片段的回文性质都记录下来。当你想知道一个大片段是不是回文时只需要查档案而不需要重新验证。五、解法三马拉车算法Manacher—— 线性时间的奇迹核心思路前面两种方法都是O(n2)O(n^2)O(n2)能不能更快马拉车算法做到了O(n)O(n)O(n)。它的核心思想是利用回文的对称性避免重复计算。但直接处理奇偶长度很麻烦所以第一步是预处理在每个字符间插入#把字符串变成统一奇数长度。原串: a b b a 处理: # a # b # b # a # 下标: 0 1 2 3 4 5 6 7 8现在所有回文都是奇数长度中心只有一个。算法维护一个最右边界right和对应的中心center。当处理位置i时如果i在right左边它关于center的对称点mirror已经被算过了可以直接利用但需要注意边界限制不能直接照搬代码实现classSolution{publicStringlongestPalindrome(Strings){if(snull||s.length()1)return;// 预处理插入 #统一奇偶StringBuildersbnewStringBuilder(#);for(charc:s.toCharArray()){sb.append(c).append(#);}Stringtsb.toString();intnt.length();int[]pnewint[n];// p[i] 以 i 为中心的回文半径intcenter0,right0;// 当前最右回文的中心和右边界intmaxLen0,start0;// 记录最长回文for(inti0;in;i){// 1. 利用对称性初始化 p[i]intmirror2*center-i;// i 关于 center 的对称点if(iright){p[i]Math.min(right-i,p[mirror]);}// 2. 尝试继续扩展intli-(p[i]1);intri(p[i]1);while(l0rnt.charAt(l)t.charAt(r)){p[i];l--;r;}// 3. 更新最右边界if(ip[i]right){centeri;rightip[i];}// 4. 记录最长回文转回原串坐标if(p[i]maxLen){maxLenp[i];start(i-p[i])/2;}}returns.substring(start,startmaxLen);}}复杂度时间O(n)O(n)O(n)—— 每个字符最多被访问常数次空间O(n)O(n)O(n)—— 预处理和半径数组评价就像一位老练的侦探不会每次遇到相似线索都从头推理。他会建立对称档案发现 A 和 B 对称A 的结论可以直接套用到 B 上。这是算法世界里最美的偷懒艺术。六、三种境界对比境界算法时间空间核心思想推荐指数凡人暴力枚举O(n3)O(n^3)O(n3)O(1)O(1)O(1)枚举所有子串⭐高手中心扩展O(n2)O(n^2)O(n2)O(1)O(1)O(1)从中心向两边扩展⭐⭐⭐⭐⭐大师动态规划O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)小回文推大回文⭐⭐⭐⭐神仙马拉车O(n)O(n)O(n)O(n)O(n)O(n)利用对称性避免重复计算⭐⭐⭐选哪个面试写代码→ 中心扩展法代码短、空间优、不易出错理解回文本质→ 动态规划是很多回文类题的基础追求极限性能→ 马拉车算法但代码复杂面试一般不考七、写在最后回文问题的美在于它把对称这个直觉概念变成了可以量化的算法。从中心扩展的直观到动态规划的系统再到马拉车算法的优雅三种解法像三种人生境界中心扩展是活在当下动态规划是积累经验马拉车则是站在经验的肩膀上飞翔。但归根结底最实用的往往是那个看起来最笨的中心扩展法 —— 因为它足够简单足够可靠就像生活中那些朴实却有效的道理。简单往往是最深的功力。欢迎在评论区分享你的理解或者指出我表述不清的地方。一起进步

相关新闻

Android 17 升级后 System.load 报错排查与加固兼容指南

Android 17 升级后 System.load 报错排查与加固兼容指南

Android 17升级后System.load报错:SO文件只读权限与加固兼容性排查 Android 项目升级系统或 targetSdk 后出现 UnsatisfiedLinkError,最容易被误判为“ABI 不匹配”、“SO 文件未打入包”或“加固破坏了库文件”。这些确实是可能的原因,但在…

2026/10/5 22:06:46 阅读更多 →
时间注意力机制:从原理到PyTorch实战,提升时序模型预测能力

时间注意力机制:从原理到PyTorch实战,提升时序模型预测能力

1. 从“平均主义”到“重点主义”:为什么我们需要时间注意力在时序数据分析的日常工作中,我们常常陷入一种“平均主义”的陷阱。无论是处理传感器读数、股票价格序列、用户行为日志,还是自然语言中的词向量序列,一个惯常的做法是&…

2026/10/1 4:09:43 阅读更多 →
从24个HTML5游戏源码到实战进阶:高效学习与改造指南

从24个HTML5游戏源码到实战进阶:高效学习与改造指南

1. 项目概述:从“收藏”到“创造”的转变每次在网上看到“分享XX个游戏源代码”这样的标题,很多开发者,尤其是刚入行的朋友,都会心头一热,感觉像是找到了一个宝库。确实,手头拥有24个不同风格、不同玩法的网…

2026/10/2 7:26:05 阅读更多 →

最新新闻

微信小程序界面设计:WXSS 选择器课程之 ::selection 伪元素实战

微信小程序界面设计:WXSS 选择器课程之 ::selection 伪元素实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 22:08:14 阅读更多 →
MRAM工业嵌入式存储方案:MR25H40CDF与PIC18LF47K42驱动实战

MRAM工业嵌入式存储方案:MR25H40CDF与PIC18LF47K42驱动实战

1. 为什么 MRAM 在工业嵌入式场景里越来越香搞过工业设备数据采集的朋友应该都有过这种体验:设备跑在现场,环境温度动辄七八十度,偶尔还要断电重启,结果回头一看,关键参数丢了,或者存储芯片的某个扇区写坏了…

2026/10/5 22:07:13 阅读更多 →
工业数据记录新方案:MRAM替换并行SRAM与PIC18F47Q10实战

工业数据记录新方案:MRAM替换并行SRAM与PIC18F47Q10实战

1. 为什么工业现场还在用并行SRAM,而MRAM已经悄悄替换了它做工业控制和嵌入式数据采集的人,大概率都遇到过这个场景:设备跑在现场,每隔几毫秒要记录一次关键状态,比如电机转速、阀门开度、累计运行时长。这些数据不能丢…

2026/10/5 22:07:13 阅读更多 →
MRAM与PIC18LF47K42工业数据存储方案:SPI驱动与掉电保护实战

MRAM与PIC18LF47K42工业数据存储方案:SPI驱动与掉电保护实战

1. 项目缘起与方案选型:为什么是 MRAM 加 PIC181.1 一个真实的数据存储痛点做过工业数据采集的朋友大概率都遇到过这个场景:设备装在配电柜里或者户外机箱内,主控每隔几秒就要把一组关键参数(累计流量、校准系数、故障快照、运行小…

2026/10/5 22:07:12 阅读更多 →
ChatGPT Codex试用心得:从dotnet项目PR看码农的可靠助手还是失业号角?TaoToken统一Key实测

ChatGPT Codex试用心得:从dotnet项目PR看码农的可靠助手还是失业号角?TaoToken统一Key实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 22:06:11 阅读更多 →
EditText 光标不闪动?从 android:textCursorDrawable 到 TaoToken 的排查路径

EditText 光标不闪动?从 android:textCursorDrawable 到 TaoToken 的排查路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 22:06:11 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →