python使用中心扩散法找出最长回文子串

描述:

输入字符串s,找出s中包含的最长回文子串

例:

输入:“abacd”        输出:”aba“

输入:”abbc“        输出:“bb”

输入:“aaaa”        输出:“aaaa”

基本思想:

        首先往左寻找与当前位置相同的字符,直到超出左侧索引范围或遇到不相等的字符为止。
        然后往右寻找与当前位置相同的字符,直到超出右侧索引范围或遇到不相等的字符为止。
        最后左右双向扩散,直到超出索引范围或左右字符不相等为止。

代码如下:

def longest_palindrome(s: str) -> str:
    max_left = 0    # 最长回文串起点
    max_right = 0   # 最长回文串终点
    max_len = 0  # 最长回文串长度
    for i in range(len(s)):
        mid = i  # 回文串中心
        left = mid - 1  # 当前回文串起点
        right = mid + 1   # 当前回文串终点
        length = 1  # 当前回文串长度
        # 向左扩散,寻找以当前字符为中心的偶数长度的回文串
        while left >= 0 and s[left] == s[mid]:
            left -= 1
            length += 1
        # 向右扩散,寻找以当前字符为中心的偶数长度的回文串
        while right < len(s) and s[mid] == s[right]:
            right += 1
            length += 1
        # 双向扩散,寻找以当前字符为中心的奇数长度的回文串
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
            length += 2
        if length > max_len:
            max_left = left
            max_right = right
            max_len = length

    return s[max_left + 1: max_right]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沉宸尘⁴⁰⁴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值