手撕:最长回文子串。

算法工程师第 5 / 15 题答题框架
参考思路:中心扩展 O(n²) 思路清晰优先→提及 Manacher O(n) 与 DP 空间劣势→奇偶中心处理。面试重正确与沟通。

五个经典回答示范

回答一 · 思路口述版

「中心扩展法:每个位置可能奇数长度中心(单字符)或偶数长度中心(两字符间隙),共 2n-1 个中心,每个中心向两侧扩展直到不匹配。O(n²) 时间 O(1) 空间,面试首选——正确性好写、复杂度可接受。DP 也是 O(n²) 但要 O(n²) 空间,Manacher 能 O(n) 但易写错,我会提一句证明知道。」

回答二 · 标准写法

function longestPalindrome(s) { let start = 0, maxLen = 1; const expand = (l, r) => { while (l >= 0 && r < s.length && s[l] === s[r]) { l--; r++; } return r - l - 1; }; for (let i = 0; i < s.length; i++) { const len = Math.max(expand(i, i), expand(i, i + 1)); if (len > maxLen) { maxLen = len; start = i - Math.floor((len - 1) / 2); } } return s.slice(start, start + maxLen); } 起点换算按奇偶中心分别推一遍。

回答三 · 进阶变体

变体一:回文子串计数——同模板累计扩展次数。变体二:允许删最多 k 个字符的最长回文——区间 DP 或贪心加判断函数二分。变体三:Manacher——插入 # 统一奇偶、维护最右边界与中心复用半径数组,O(n)。面试里主动说明 Manacher 的核心是避免重复扩展,展示深度而不必现场默写全对。

回答四 · 边界与测试

必测:空串、单字符、全相同字符串(答案是整个串)、aa 与 aba、首尾构成回文如 abacdfc 的子串情况。偶数中心 expand(i,i+1) 别漏——漏掉则 aa 只能返回长度 1,是最常见的错。

回答五 · 常见错误

错误一:只枚举奇数中心,偶数回文全丢。错误二:起点换算写错——maxLen 与起点的关系按奇偶要分别验证。错误三:DP 解法区间遍历顺序写反——必须长度从小到大。点评:这题考察代码细节纪律,中心扩展写错的大多是边界换算没在纸上推。

怎么练这道题
  1. 打开 模拟练习,选择「算法工程师」方向,限时 3 分钟作答本题。
  2. 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
  3. 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。

这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。

开始限时演练