最长回文子串
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 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
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
输入: [""]
期望: ""
空串没有任何中心可展开,直接返回空串。