最长回文子串动态规划

最长回文子串动态规划

回文串(palindrome)是指从左往右读和从右往做读都一样的字符串。例如,”aba”、”abba”、”babad”都是回文串。

最长回文子串(Longest Palindromic Substring,简称LPS)指的是给定一个字符串,找到其中最长的回文子串。

解法分析

最直接的想法是枚举所有子串并验证是否为回文串,但这个方法会超时,时间复杂度为$O(n^3)$。

更优秀的解法是基于动态规划算法实现,时间复杂度为$O(n^2)$。

我们用$P(i,j)$表示$i$到$j$中是否为回文串,$P(i,j)$的定义如下:

P(i,j)=true   [i,j]为回文串
P(i,j)=false  [i,j]不是回文串

当$i=j$时,$P(i,j)=true$;
当$j=i+1$时,$P(i,j)$要看$i$和$j$是否相等;
当$j>i+1$时,$P(i,j)$要看$P(i+1,j-1)$是否为回文串,以及$i$和$j$是否相等。

我们考虑用“填表法”来解决这个问题,创建一个二维表格$dp$,从左上角开始遍历,从而把所有可能情况的$P(i,j)$都计算出来。初始化时,所有的$dp[i][i]$的值均为$true$,因为单个字符是回文串。

填表示例如下所示:

table

最后,在得到表格后,我们可以通过遍历所有的$dp[i][j]$,找到最长的为true的$i,j$,并返回这个最长回文子串。

代码实现

代码如下所示:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        dp = [[False] * n for _ in range(n)]
        ans = ""
        for l in range(n):
            for i in range(n):
                j = i + l
                if j >= n:
                    break
                if l == 0:
                    dp[i][j] = True
                elif l == 1:
                    dp[i][j] = (s[i] == s[j])
                else:
                    dp[i][j] = (dp[i+1][j-1] and s[i] == s[j])
                if dp[i][j] and l + 1 > len(ans):
                    ans = s[i:j+1]
        return ans

总结

本文介绍了求解最长回文子串问题的一个基于动态规划的解法,时间复杂度为$O(n^2)$。在具体实现中,我们采用“填表法”来求解。

如果你还有问题,欢迎留言交流。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:最长回文子串动态规划 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • hexdump——linux系统的二进制文件查看工具

    hexdump——linux系统的二进制文件查看工具 在Linux系统中,我们经常会遇到需要查看二进制文件内容的情况,如查看可执行文件的二进制代码、查看网络数据包的二进制内容等。此时,一个非常有用的工具是hexdump。hexdump是Linux系统下的一个十六进制查看工具,用于查看二进制文件的内容。下面,我们来介绍一下如何使用hexdump来查看二进制文件…

    其他 2023年3月28日
    00
  • sqlserver1对多更新

    SQL Server1对多更新 SQL Server是一款广泛应用于企业应用系统的关系型数据库管理系统。在日常开发中,对数据库进行增删改查的操作十分常见,而对多个记录进行更新的需求也时有所需。本文将介绍如何在SQL Server中进行对多更新的操作。 对多更新的语法 对多更新的语法如下所示: UPDATE 表名 SET 字段名=值 FROM 表名1 INNE…

    其他 2023年3月28日
    00
  • win10预览版如何安装和升级有哪些常用的方法

    Win10预览版安装及升级攻略 Win10预览版是微软为开发人员及用户提供的早期体验版本,用户可以在其中试用新功能、提出建议和反馈问题等。本文将详细讲解Win10预览版的安装及升级方法。 安装方法 Win10预览版有两种安装方法,分别为:通过Windows Insider程序安装和通过官方ISO镜像安装。 通过Windows Insider程序安装 打开设置…

    other 2023年6月27日
    00
  • Python数据预处理:使用Dask和Numba并行化加速

    Python数据预处理: 使用Dask和Numba并行化加速 数据预处理是数据科学的重要部分之一。在数据处理中,数据经常需要由原始格式转化为适合于分析和建模的格式。预处理通常涉及许多计算密集型任务,如排序、分组和聚合,这些任务需要处理大量的数据。在这篇文章中,我们将探讨如何使用Dask和Numba来加速Python数据预处理任务。 Dask简介 Dask是一…

    其他 2023年3月28日
    00
  • javascript实现禁止右键和F12查看源代码

    实现禁止右键和F12查看源代码是一种常见的网页保护技巧,可以防止非法复制、盗取网页资源等安全问题。下面是针对该问题的完整攻略: 步骤一:禁止右键 方法一:使用JavaScript 在HTML页面的 \ 标签内加入下述js代码可以禁止右键: <script> document.oncontextmenu = function() { return …

    other 2023年6月27日
    00
  • iconfont-阿里巴巴矢量图标库

    以下是详细讲解“iconfont-阿里巴巴矢量图标库”的完整攻略: iconfont-阿里巴巴矢量图标库的完整攻略 iconfont-阿里巴巴矢量图标库是一种常用的图标库,可以用于网站和移动应用的设计和开发。本攻略将介绍如何使用iconfont-阿里巴巴矢量图标库。 步骤一:注册并登录iconfont 首先需要注册并登录iconfont,可以按照以下步骤进行…

    other 2023年5月10日
    00
  • Django零基础入门之自定义标签及模板中的使用

    让我们来详细讲解“Django零基础入门之自定义标签及模板中的使用”的完整攻略。 什么是Django自定义标签 Django中的自定义标签是一种扩展模板标签的功能,而这些标签提供了在模板中执行特定的功能,可以扩展Django的模板系统和标记语言。 如何定义自定义标签 1.定义标签函数 创建一个保存标签函数的Python模块,通常称为templatetags。…

    other 2023年6月25日
    00
  • zip伪加密(deprecated)

    zip伪加密(deprecated) 在过去,一些人使用Zip伪加密来保护其机密数据。然而,这种方法已经被证明是不安全的,因为它只是简单地让Zip文件看起来加密,并没有真正的对文件进行加密。 什么是Zip伪加密? Zip伪加密是一种不安全的对Zip文件进行加密的方法。使用此方法,您可以打开一个看起来是加密的Zip文件,但实际上Zip文件中存储的所有文件可以很…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部