力扣刷题day004——最长回文子串

1.题目描述

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

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

2.题目分析

对于回文子串的情况,我们可以分成三种情况讨论

1.最长子串长度为1,这种情况要么是字符长度为1,要么是不存在回文的情况

2.最长子串长度为2,那么我们只用判断这个字符和它的下一个相等即可

3.最长子串长度大于2,那么对于长度大于2的子串,如果它的首尾字符相等(s[i] == s[j]),并且去掉首尾字符的子串(即 dp[i+1][j-1])也是回文,那么整个子串就是回文。因此,状态转移方程为:dp[i][j] = (s[i] == s[j]) and dp[i+1][j-1]

3.代码实现

class Solution:

    def longestPalindrome(self, s: str) -> str:

        n = len(s)  

        #如果字符串只有一个元素,那么我们直接返回它即可

        if n < 2:  

            return s  

         

        #设置一个初始值都为False的二位布尔矩阵,如果发现回文,则设置为true dp[i][j] 表示 s[i:j+1] 是否为回文子串  

        dp = [[False] * n for _ in range(n)]  

        max_len = 1  # 最长回文子串的长度  

        start = 0    # 最长回文子串的起始位置  

         

        # 初始化单个字符为回文  

        for i in range(n):  

            dp[i][i] = True  

         

        # 检查长度为2的子串  

        for i in range(n - 1):  

            if s[i] == s[i + 1]:  

                dp[i][i + 1] = True  

                max_len = 2  

                start = i  

         

        # 检查长度大于2的子串  

        for length in range(3, n + 1):  

            for i in range(n - length + 1):  

                j = i + length - 1  

                if s[i] == s[j] and dp[i + 1][j - 1]:  

                    dp[i][j] = True  

                    if length > max_len:  

                        max_len = length  

                        start = i  

         

        # 切片返回最长回文子串  

        return s[start:start + max_len]

4..吐槽

啊啊,力扣第四题太难了,弄不明白,留给以后的我再去烦脑吧,今天让我们先来学习一下第五题——最长回文子串吧

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值