【leetcode】【中等】5. 最长回文子串【中心扩散+动态规划法】

题目概述:
在这里插入图片描述


题目注意点:

  • 这里需要区分两种情况,奇数对称和偶数对称结构。
  • 这里大佬,用到了一个牛逼的方法max(str1,str2,key=len)

解题思路:

  1. 中心扩散法,确认一个中心,往两边扩散查找,遇到不符合就提停止,返回扩散前一次的值。
  2. 区分奇数和偶数对称情况,遇到更好的就存下,最后返回结果

完整代码:

 #中心扩散法Spread From Center
    def spread(self, s, left, right):
        """
        left = right 的时候,此时回文中心是一条线,回文串的长度是奇数
        right = left + 1 的时候,此时回文中心是任意一个字符,回文串的长度是偶数
        """
        # 当左右字符相等,且不超出范围,就继续判断
        while left >= 0 and right < len(s) and s[left] == s[right]:
            left -= 1
            right += 1
        return s[left + 1:right]  # 这里left扩张以后,检测不符合,所以需要回退一个范围。所以left + 1 
        # right由于左闭右开,所以不用做处理
   

# 动态规划法-中心扩散法Spread From Center
    def spread_from_center(self, s:str) -> str:        
        if s==s[::-1]:
            return s
        res = s[:1]   #  初始化返回值,为第一个字符
        for i in range(len(s)):  # i是每次的中心位置
            palindrome_odd= self.spread(s,i, i)  # 中心位置落在字符上
            palindrome_even= self.spread(s,i, i + 1)   # 中心位置落在字符中间
            # 当前找到的最长回文子串
            res = max(palindrome_odd,palindrome_even,res,key=len)
        return res

作者:boywithacoin_cn
链接:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/pythonguan-jie-bao-li-fa-dong-tai-zhong-xin-kuo-sa/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值