力扣5:最长回文子串

博客介绍了如何用动态规划解决力扣第5题,即找到字符串中最长的回文子串。常规暴力方法的时间复杂度为O(n^3),而动态规划方法通过状态转移矩阵来优化,复杂度降低。文章提供了详细的代码实现,包括初始化对角线元素为True,以及根据左下方元素填充矩阵的过程,同时考虑了不构成区间的特殊情况。
摘要由CSDN通过智能技术生成
5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:

输入: "cbbd"
输出: "bb"

常规的暴力法就是遍历各个子串,并且判断子串是否是回文串,这样时间复杂度为O(n^3)

接下来我们看动态规划做法
我们假设一个dp数组,dp[i][j]表示s[i…j]是否为回文串
由于回文子串具备天然的状态转移特性
当两头字母相同时,去掉两头字母,剩下的子串也应该是回文串

dp[i][j] = (s[i]==s[j]) and dp[i+1][j-1]

另外我们需要判断不构成区间的情况
当(j-1) - (i+1) + 1 < 2时,子串并不构成区间
需要额外判断

综上我们有以下代码

class Solution:
    def longestPalindrome(self, s: str) -> str:
        length = len(s)
        if length < 2:
            return s

        maxlen = 1
        begin = 0

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

        for i in range(length):
            dp[i][i] = True

        for j in range(1, length):
            for i in 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值