• 【Leetcode刷题Python】5. 最长回文子串


    1 题目

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

    输入:s = “babad”
    输出:“bab”
    解释:“aba” 同样是符合题意的答案。

    示例 2:

    输入:s = “cbbd”
    输出:“bb”

    2 解析

    动态规划思路
    状态: 用 dp(i,j)表示字符串 s的第 i到 j个字母组成的串(下文表示成 s[i:j])是否为回文串

    d p ( i , j ) = { true, 如果子串  S i … S j  是回文串 false, 其它情况 dp(i,j) = {true,如果子串~SiSj~是回文串false,其它情况 dp(i,j)={true,false,如果子串 SiSj 是回文串其它情况

    这里的「其它情况」包含两种可能性:
    s[i, j] 本身不是一个回文串;i > j,此时 s[i, j]本身不合法。

    状态转移方程:

    d p ( i , j ) = d p ( i + 1 , j − 1 ) ∧ ( S i = = S j ) dp(i, j) = dp(i+1, j-1) \wedge (S_i == S_j) dp(i,j)=dp(i+1,j1)(Si==Sj)

    也就是说,只有 s[i+1:j-1]是回文串,并且 s 的第 i 和 j个字母相同时,s[i:j]才会是回文串。
    上文的所有讨论是建立在子串长度大于 2 的前提之上的,我们还需要考虑动态规划中的边界条件,即子串的长度为 1 或 2。对于长度为 1 的子串,它显然是个回文串;对于长度为 2的子串,只要它的两个字母相同,它就是一个回文串。因此我们就可以写出动态规划的边界条件:

    { d p ( i , i ) = true d p ( i , i + 1 ) = ( S i = = S i + 1 ) {dp(i,i)=truedp(i,i+1)=(Si==Si+1) {dp(i,i)=truedp(i,i+1)=(Si==Si+1)

    根据这个思路,我们就可以完成动态规划了,最终的答案即为所有dp(i,j)=true 中j−i+1(即子串长度)的最大值。注意:在状态转移方程中,我们是从长度较短的字符串向长度较长的字符串进行转移的,因此一定要注意动态规划的循环顺序。

    3 python实现

    class Solution:
        def longestPalindrome(self, s: str) -> str:
            n = len(s)
            if n<2:
                return s
            max_len = 1
            begin = 0
            dp = [[False]*n for _ in range(n)]
            for i in range(n):
                dp[i][i] =True
            for L in range(2,n+1):
                for i in range(n):
                    j = L+i-1
                    if j>=n:
                        break
                    if s[i] !=s[j]:
                        dp[i][j] =False
                    else:
                        if j-i<3:
                            dp[i][j] =True
                        else:
                            dp[i][j] = dp[i+1][j-1]
                    if dp[i][j] and j-i+1>max_len:
                        max_len = j-i+1
                        begin = i 
            return s[begin:begin+max_len]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    java计算机毕业设计服装批发进销存系统源码+mysql数据库+系统+lw文档+部署
    多媒体内容理解在美图社区的应用实践
    【Qt】【模型视图架构】代理模型
    推特的算法规则你知道多少?
    Arm64 linux Virtual memory分析
    京东数据报告:2023年8月京东手机行业品牌销售排行榜
    基于虚拟同步发电机控制的双机并联Simulink仿真模型
    尚硅谷Docker基础篇和Dockerfile超详细整合笔记
    极狐(GitLab) 马景贺:DevSecOps落地实践的挑战与应对之道
    动画圆圈文字标志效果
  • 原文地址:https://blog.csdn.net/weixin_43935696/article/details/126802926