← 返回编程题库
coding-longest-palindromic-substring简单免费版2000ms未尝试

最长回文子串

Longest Palindromic Substring

开始编码

做市数据组对当日的逐笔 tick 流做模式匹配诊断:把每个 tick 编码成一个字符(例如 'u' 上涨、'd' 下跌、'f' 平),整个交易日就压缩成一个紧凑的字节串,刻画了当日的微观结构。组内有些信号要找镜像对称段——正读反读都一样的子串,如 "udfdu""udddu"——因为一段长的镜像段意味着市场在某个价位上反复来回、犹豫不决。这一类信号最基础的工具就是:给定编码后的会话串 s,找出最长回文子串

请实现 solution(s: str) -> str。返回 s 中最长的回文连续子串(正读反读相同)。长度并列时返回最左的那个(起始下标最小)。边界:s 为空时返回 "";单字符本身就是回文,原样返回;若不存在长度大于 1 的回文,返回 s[0](仍是最左的长度为 1 的回文)。

示例solution("babad") 返回 "bab"——"bab""aba" 长度都是 3,但 "bab" 起始下标 0、"aba" 起始下标 1,最左者胜。solution("cbbd") 返回 "bb"——没有长度超过 1 的奇数回文,但下标 1 与 2 之间的偶数中心扩展得到 "bb"solution("abcd") 返回 "a"——无长度大于 1 的回文,返回最左单字符。

干净的解法是扩展中心法:对每个下标 i,分别尝试两类中心——奇数中心 (i, i)偶数中心 (i, i+1)——双指针向外扩展,只要两端字符相等就继续。维护当前最优(最长,长度并列时最左)。n ≤ 1000、共 2n − 1 个中心,总时间 O(n²)、额外空间 O(1),完全在预算之内。

约束条件

  • 0 ≤ len(s) ≤ 1000
  • s 仅包含 ASCII 字符
  • 比较区分大小写:'A' 与 'a' 视为不同字符
  • 空串必须返回空串
  • 长度并列时返回起始下标最小(最左)的回文子串

样例

Case 1 · classic LC5 — babad

输入: ["babad"]

期望: "bab"

扩展中心法:以 i=1 为奇数中心展开得到 "bab"(长度 3);以 i=2 为奇数中心展开得到 "aba"(长度 3)。长度并列时返回起始下标更小的,即 "bab"(start=0)。

Case 2 · classic LC5 — cbbd, even-length winner

输入: ["cbbd"]

期望: "bb"

无奇数中心能扩展超过长度 1。偶数中心 (i=1, i+1=2) 处 s[1]=s[2]='b',得到 "bb"。这就是「奇 vs 偶中心」必须都试的原因。

Case 3 · empty string

输入: [""]

期望: ""

空串没有任何中心可展开,直接返回空串。

最近提交

还没有提交记录。

编码区

实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。

加载编辑器...
计时0:00

默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。

Case 1 · classic LC5 — babad

输入: ["babad"]

期望: "bab"

扩展中心法:以 i=1 为奇数中心展开得到 "bab"(长度 3);以 i=2 为奇数中心展开得到 "aba"(长度 3)。长度并列时返回起始下标更小的,即 "bab"(start=0)。

Case 2 · classic LC5 — cbbd, even-length winner

输入: ["cbbd"]

期望: "bb"

无奇数中心能扩展超过长度 1。偶数中心 (i=1, i+1=2) 处 s[1]=s[2]='b',得到 "bb"。这就是「奇 vs 偶中心」必须都试的原因。

Case 3 · empty string

输入: [""]

期望: ""

空串没有任何中心可展开,直接返回空串。