PrepStack · Markdown HTML

中心扩展 / Manacher 回文

字符串匹配、哈希与回文 · HTML

数学 / 逻辑形态

奇回文中心为 (i,i),偶回文中心为 (i,i+1);只要 s[l]==s[r] 就扩展半径。

识别信号

容易误判的相似信号

SignalWhy it is different
回文子序列子序列不连续,中心扩展会漏解,应使用 DP。
需要大量区间回文查询重复中心扩展代价高,可用 DP、哈希或 Manacher 半径。

核心不变量

扩展循环开始时 s[l+1:r] 已是回文;端点相等后加入的新区间仍是回文。

状态、转移与处理顺序

ItemDefinition
State当前左右端点、最佳区间 best、可选的回文计数。
Transition对每个奇偶中心分别扩展;每次成功更新答案,再 l--、r++。
Frontier / order左右端点是对称前沿;首次不相等时该中心所有更大半径都不可能。

Python 骨架

def palindromes_by_center(s):
    best = (0, 0)
    count = 0
    def grow(l, r):
        nonlocal best, count
        while l >= 0 and r < len(s) and s[l] == s[r]:
            count += 1
            if r-l > best[1]-best[0]: best = (l, r)
            l -= 1; r += 1
    for i in range(len(s)):
        grow(i, i)
        grow(i, i+1)
    l, r = best
    return s[l:r+1], count

正确性思路

  1. 每个回文有唯一中心与半径。
  2. 算法枚举全部 2n-1 个奇偶中心。
  3. 对一个中心,扩展逐半径检查且首次失配后更大半径也失败。
  4. 因此每个回文恰被计数一次,最长者必被记录。

复杂度

TimeSpaceParameters
最坏 O(n²)O(1) 不计输出n 为字符串长度;Manacher 可降至 O(n)

边界条件

错误模式

PatternWhy it fails / fix
只枚举奇中心会漏掉所有偶长度回文。
比较后才做边界检查端点访问前必须确认合法。
把半径当长度奇偶中心的长度公式不同,最好直接维护端点。

选择与排除规则

相关模板

RelationTemplateBoundary
查询替代Rolling Hash / Rabin–Karp需要快速验证许多指定区间

原创微型例子

环节内容
Result最长回文为 aba,共有 5 个回文子串。
Scenario字符串 abac。
Walkthrough中心 b 扩展出 aba;四个单字符各贡献一个,其余中心首步失配。

Recall prompts

我的补充