最长回文子串动态规划

最长回文子串动态规划

回文串(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日

相关文章

  • Vue使用video.js的代码详解

    下面将详细讲解Vue使用video.js的代码详解及其完整攻略。 什么是Vue Vue是当前较为流行的前端框架之一,它采用MVVM的模式,使得数据和UI的双向绑定显得更加简单和快捷。 什么是video.js video.js是一款开源的HTML5视频播放器,可以进行二次开发以满足开发者的需求,比浏览器自带的HTML5播放器具有更好的兼容性和支持性。 在Vue…

    other 2023年6月27日
    00
  • win10临时文件夹移动到c盘根目录下怎么操作?临时文件夹移动到c盘教程

    下面是详细的操作攻略,我分别给出了Windows 10系统自带的方法和通过第三方软件进行操作的方法。 方法一:使用Windows自带的设置功能 打开“Windows设置”菜单,通过键盘快捷键 “Win+I” 实现 在“Windows设置”窗口中选择“系统”,然后选择“存储” 在“存储”菜单下方找到“更多存储设置”,点击进入 在更多存储设置页面下,找到“临时文…

    other 2023年6月27日
    00
  • vue实现图片加载完成前的loading组件方法

    下面是关于“vue实现图片加载完成前的loading组件方法”的完整攻略。 1. 前置知识 在进行图片加载前的loading组件的实现之前,需要掌握以下几个知识点:1. html中的图片标签 <img>2. 图片加载事件 load 和 error3. vue组件基本语法 2. 实现过程 2.1 创建loading组件 首先使用 vue-cli 快…

    other 2023年6月25日
    00
  • 解析C语言中位字段内存分配的问题

    解析C语言中位字段内存分配的问题 什么是位字段? 在C语言中,位字段是一种结构,用来存储相对小的整数值。它是由两部分组成:一个整型成员和一些位域成员。其中,整型成员定义了整个结构体的长度,而位域成员则可以控制整型成员中的位分配。 位字段的内存分配问题 在使用位字段时,需要注意内存分配的问题。一般情况下,位字段会占用比较小的内存空间。但有时在定义位字段时,可能…

    other 2023年6月25日
    00
  • python3 读取文件跳过文件第一行内容

    python3 读取文件跳过文件第一行内容 在Python中读取文件是一项基本操作,但如果文件的第一行是文件的元数据或标题,则有时需要跳过第一行以读取其余内容。Python提供了几种方法来实现这一目的。 方法一:使用fileinput库 fileinput库可以让我们轻松地遍历文件中的每一个行,同时它可以让我们保持打开文件,不需要主动关闭: import f…

    其他 2023年3月28日
    00
  • 手机内存128和256哪个速度快 128g和256g区别对比

    手机内存128和256哪个速度快?128g和256g区别对比攻略 1. 内存速度对比 手机内存的速度主要由两个因素决定:存储类型和容量。在比较128GB和256GB内存速度时,容量并不是决定性因素,因为它们使用的存储类型相同。因此,128GB和256GB内存的速度是相同的。 2. 128GB和256GB内存的区别对比 尽管128GB和256GB内存的速度相同…

    other 2023年8月2日
    00
  • 文卓爷模拟器打开报错等常见问题及其解决办法

    文卓爷模拟器打开报错等常见问题及其解决办法 文卓爷模拟器是一款功能强大的模拟器,但在使用过程中也有可能会出现一些问题,下面我们来看下常见问题及其解决办法。 1. 模拟器无法正常启动 问题描述 启动文卓爷模拟器时,出现错误提示,可能是黑屏、闪退等。 解决办法 点击电脑桌面上的“文卓爷模拟器”图标,并右键以管理员身份运行; 检查电脑是否联网,可能需要更新模拟器版…

    other 2023年6月27日
    00
  • navicat查询功能

    Navicat查询功能 Navicat 是一款强大的数据库管理工具,它支持多种数据库,包括 MySQL、PostgreSQL、Oracle、SQLite 等,而查询功能是 Navicat 最常用的功能之一。 在 Navicat 中,查询是通过 SQL 语句来实现的。用户可以使用 Navicat 提供的图形化界面来构造 SQL 语句,也可以直接编写 SQL 语…

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