题目描述
给定一个字符串 SS,请你求出 SS 的最长回文子串。
输入描述
输入仅一行,包含一个字符串 SS。
1≤∣S∣≤5×1051≤∣S∣≤5×105,保证 SS 只包含小写字母、大写字母、数字。
输出描述
输出共 11 行,包含一个整数,表示答案。
输入输出样例
示例 1
输入
aa1ABA1b
输出
5
# 定义一个函数,用于从中心向两边扩展,寻找以给定位置为中心的最长回文子串的长度
# 参数s是输入的字符串,left和right分别是当前考虑的回文子串中心的左右两侧位置
def expand_around_center(s, left, right):
# 当左边索引没有越界,右边索引还在字符串内,且左右两边的字符相等时,继续扩展
while left >= 0 and right < len(s) and s[left] == s[right]:
left -= 1 # 向左扩展
right += 1 # 向右扩展
# 返回扩展后的回文子串的长度(注意:要减去多算的left和right自己占据的1个位置)
return right - left - 1
# 定义一个函数,用于找到字符串中的最长回文子串
def longest_palindrome(s):
if len(s) < 2:
# 如果字符串长度小于2,那么它本身就是最长回文子串
return s
start = 0 # 最长回文子串的起始位置
end = 0 # 最长回文子串的结束位置
# 遍历字符串中的每个字符作为可能的回文中心
for i in range(len(s)):
# 考虑回文中心是一个字符的情况
len1 = expand_around_center(s, i, i)
# 考虑回文中心是两个相同字符之间的空隙(例如:"abba"中的"bb")
len2 = expand_around_center(s, i, i + 1)
# 取两种情况下的最长回文子串长度
max_len = max(len1, len2)
# 如果当前找到的最长回文子串比之前的更长,则更新起始和结束位置
if max_len > end - start:
# 更新起始位置为当前中心左边开始的位置(根据回文长度调整)
start = i - (max_len - 1) // 2
# 更新结束位置为当前中心右边结束的位置(根据回文长度调整)
end = i + max_len // 2
# 返回找到的最长回文子串
return s[start:end+1]
# 测试
s = input() # 从标准输入读取字符串
result = longest_palindrome(s) # 调用函数找到最长回文子串
print(len(result)) # 打印最长回文子串的长度