欢迎光临
我们一直在努力

LeetCode 2472 不重叠回文子字符串的最大数目:两条引理、六种实现与实测取舍

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */
#content_views .toc,
/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */
#content_views.markdown_views > p:empty:has(+ .toc),
#content_views.markdown_views > .toc + p:empty,
/* 富文本旧版目录标记 */
#content_views.htmledit_views #main-toc,
#content_views.htmledit_views #hr-toc,
#content_views.htmledit_views p[id*=\”-toc\”] {
display: none !important;
}
/* 目录去掉后,紧跟的首个标题不再多出一块上边距 */
#content_views.markdown_views > .toc + h1,
#content_views.markdown_views > .toc + h2,
#content_views.markdown_views > .toc + h3,
#content_views.markdown_views > .toc + h4,
#content_views.markdown_views > .toc + p:empty + h1,
#content_views.markdown_views > .toc + p:empty + h2,
#content_views.markdown_views > .toc + p:empty + h3,
#content_views.markdown_views > .toc + p:empty + h4 {
margin-top: 0 !important;
}

LeetCode 2472 不重叠回文子字符串的最大数目:两条引理、六种实现与实测取舍

**结论速览:**本题表面上要在 O(n²) 个回文候选里做区间调度,实际上被两条引理压缩到\”每个起点只看两个定长窗口\”。引理一:长度 ≥ k+2 的回文去掉首尾仍是回文,逐层收缩必然停在 k 或 k+1,所以最优解只用这两类长度;引理二:不重叠选段的数目最大化就是经典的区间调度,按\”结束位置最早\”贪心即最优。两者合起来,复杂度从 O(n²) 的区间 DP 一路降到 O(n)。全文给出六种实现(全部通过 3000 组随机对拍)、两条引理的严格证明、九个坑点,以及同一组输入下的实测耗时。

这是一道\”看着像 DP、实际是贪心\”的典型题。它的难点不在代码,而在敢不敢相信两条结构性引理:一旦相信,代码只有二十行;一旦不信,就只能老老实实写 O(n²) 的区间 DP。更有意思的是,两种写法在同一组 2000 长度的输入上差了五百倍——437 毫秒对 0.8 毫秒。这种差距不是常数优化堆出来的,而是问题规模本身被砍掉了一个维度。

全文代码以 Python 为主,全部是可直接运行的完整实现;文中所有耗时都来自同一台机器上的真实测量,不是估算。

目录

  • 一、题目重述与三个语义要点

  • 二、引理一:只需要长度 k 与 k+1 的回文

  • 三、引理二:最早结束的贪心最优

  • 四、解法一:回文表 + 区间 DP(最稳的第一版)

赞(0)
未经允许不得转载:171主机测评 » LeetCode 2472 不重叠回文子字符串的最大数目:两条引理、六种实现与实测取舍
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址