【LeetCode 5.】 最长回文子串

一道题能否使用动态规划就在于判断最优结构是否是通过最优子结构推导得到?如果显然具备这个特性,那么就应该朝动态规划思考。如果令dp[i][j]表示串s[i:j+1]是否是回文子串,那么判断dp[i][j] 是否是回文子串,相当于判断s[i] 与 s[j] 是否相等 + dp[i+1][j-1] 是否相等。

1. 题目

2. 分析

这道题我写了一个小时才写出来,相比之前看答案写题是有进步的。估计这道题我这半个月都不会忘记了。一道题能否使用动态规划就在于判断最优结构是否是通过最优子结构推导得到?如果显然具备这个特性,那么就应该朝动态规划思考。

具体看一个样例:s="babad",判断这个字符串是否是最长回文子串,相当于判断aba是否是回文子串和b与d是否相等。

0 1 2 3 4
b a b a d

相当于判断最后一个字符和要判断子串的第一个字符是否相等,外加判断内部子串是否是回文子串。

1 2 3
a b a

那么抽象一下,就可以得出:判断dp[i][j] 是否是回文子串,相当于判断s[i] 与 s[j] 是否相当 + dp[i+1][j-1] 是否相等。

3. 代码

class Solution:
    def longestPalindrome(self, s: str) -> str:
        dp = [[0] * len(s) for i in range(len(s))]
        
        for cur_length in range(1, len(s)+1):
            for i in range(0, len(s)):
                j = i + cur_length - 1 # 终点下标
                if j >= len(s): # 越界处理
                    continue
                if j == i:
                    dp[i][j] = 1
                    continue
                if cur_length == 2: # 长度为2的区间
                    if s[j] == s[i]:
                        dp[i][j] = 1
                    continue
                if s[j] == s[i] and dp[i+1][j-1]: # 如果起点和终点相同
                    dp[i][j] = 1

        # print(dp)
        max_len = 0
        res = ""
        for i in range(len(s)):
            for j in range(len(s)):
                if dp[i][j] == 1:
                    if j-i+1 > max_len:
                        max_len = max(max_len, j-i+1)
                        res = s[i:j+1]
        return res

相关推荐

  1. LeetCode-5

    2024-06-16 02:04:01       50 阅读
  2. 【Manacher】LeetCode-5.

    2024-06-16 02:04:01       56 阅读
  3. LeetCode_5_中等_

    2024-06-16 02:04:01       56 阅读
  4. leetcode 5.

    2024-06-16 02:04:01       44 阅读
  5. leetcode 5, Manachers算法

    2024-06-16 02:04:01       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 02:04:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 02:04:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 02:04:01       82 阅读
  4. Python语言-面向对象

    2024-06-16 02:04:01       91 阅读

热门阅读

  1. Mac的m系列芯片安装虚拟机--简单流程

    2024-06-16 02:04:01       31 阅读
  2. git 如何拉取最新代码

    2024-06-16 02:04:01       31 阅读
  3. Nacos入门与实践

    2024-06-16 02:04:01       27 阅读
  4. 08:打印字符

    2024-06-16 02:04:01       28 阅读
  5. kubernetes部署dashboard

    2024-06-16 02:04:01       28 阅读
  6. go 协程

    go 协程

    2024-06-16 02:04:01      32 阅读
  7. 增量数据库同步软件PanguSync侵入式全面清理脚本

    2024-06-16 02:04:01       32 阅读
  8. LeetCode 596, 13, 2

    2024-06-16 02:04:01       34 阅读
  9. 【无标题】

    2024-06-16 02:04:01       25 阅读