最长回文子串——华为算法机试(中等)python版

题目

给你一个字符串 s,找到 s 中最长的回文子串

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:

输入:s = "cbbd"
输出:"bb"
 

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母组成

解题思路

回文字符串是对称的,通过实例也可以发现,不光有奇数个字符的回文,也可以是偶数型的对称,甚至一个字符。那么回文子串的可能性包括一下三种:

  • 单个字符,如 a
  • 偶数回文,如 abba
  • 奇数回文,如 aba

那么每个回文都会有一个回文的中心,也就是对称轴。想要找最长的子串,就可以遍历字符串,寻找将某个字符或某两个字符作为回文中心时能找到的最长回文子串。

代码实现

class Solution(object):
    def finding(self,s,left,right):
        while right<len(s) and s[left]==s[right] and left>=0:
            left-=1
            right+=1
        return left+1,right-1
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        start, end=0,0
        for i in range(len(s)):
            s1,e1=self.finding(s,i,i)#以该字符为回文中心 奇数型
            s2,e2=self.finding(s,i,i+1)#以该字符和下一个字符为回文中心 偶数型
            if e1-s1>end-start:
                start, end=s1,e1
            if e2-s2>end-start:
                start,end=s2,e2
        return s[start:end+1]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值