力扣 5. 最长回文子串 python AC

动态规划

python 复制代码
class Solution:
    def longestPalindrome(self, s):
        size = len(s)
        maxl = 1
        start = 0
        dp = [[False] * size for _ in range(size)]
        for i in range(size):
            dp[i][i] = True
        for L in range(2, size + 1):
            for i in range(size):
                j = L + i - 1
                if j >= size:
                    break
                if s[i] == s[j]:
                    if L >= 4:
                        dp[i][j] = dp[i + 1][j - 1]
                    else:
                        dp[i][j] = True
                if dp[i][j] and maxl < L:
                    maxl = L
                    start = i
        return s[start:start + maxl]

这里将dp数组含义设为当前位置是否是回文子串

--创建二维dp[i][j],表示从索引i到索引j位置的子串是否是回文子串(初始值为False)

--将每个单个字符设置为True(长度为1的子串一定是回文子串)

--从2到size遍历L(代表子串长度)(从长度为2开始,因为长度为1的上一步已经标为了True)

--从0到size-1遍历i(代表子串起点)

--通过子串长度L和子串起点i求出子串终点(索引为L + i - 1)

--如果终点超过了整个字符串则退出

--如果i位置字符和j位置字符相同

--如果长度大于等于4

--dp[i][j]是否是回文子串 = dp[i+1][j-1]是否是回文子串

--否则(长度小于4,即没有更小的区间来推断)

--dp[i][j] = True

--判断长度是否比记录过的最大长度最大

--是的话更新最大长度,并记录此时的起点i

--返回字符串s从start到start+最大长度的子串

相关推荐
默默coding的程序猿15 小时前
3.git的分支携带问题是什么?怎么解决?
java·git·python·svn·gitee·github·intellij-idea
地平线开发者15 小时前
征程 6 | 征程 6 工具链如何支持 Matmul/Conv 双 int16 输入量化?
算法·自动驾驶
程序员大雄学编程16 小时前
「深度学习笔记4」深度学习优化算法完全指南:从梯度下降到Adam的实战详解
笔记·深度学习·算法·机器学习
新子y16 小时前
【小白笔记】PyTorch 和 Python 基础的这些问题
pytorch·笔记·python
我是李武涯16 小时前
PyTorch DataLoader 高级用法
人工智能·pytorch·python
Lynnxiaowen17 小时前
今天我们开始学习python语句和模块
linux·运维·开发语言·python·学习
小O的算法实验室17 小时前
2022年ASOC SCI2区TOP,基于竞争与合作策略的金字塔粒子群算法PPSO,深度解析+性能实测,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
南莺莺17 小时前
邻接矩阵的基本操作
数据结构·算法··邻接矩阵
ThreeAu.17 小时前
pytest 实战:用例管理、插件技巧、断言详解
python·单元测试·pytest·测试开发工程师
资源补给站17 小时前
服务器高效操作指南:Python 环境退出与 Linux 终端快捷键全解析
linux·服务器·python