最长回文子串

题目描述

给定一个字符串 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))  # 打印最长回文子串的长度

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vsropy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值