IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 动态规划之最长回文串 -> 正文阅读

[数据结构与算法]动态规划之最长回文串

最长回文子串

leetcode 5

在这里插入图片描述

若一个字符串是回文串,那么它的首尾元素应该相同,并且若该字符串的长度大于2,除去首尾元素后依然是回文串。

由此可得到判断是否是回文串的递推公式, P ( i , j ) P(i, j) P(i,j) 代表子串 S i S_{i} Si? S j S_{j} Sj?是否是回文串:

P ( i , j ) = { ?true,? ?如果子串? S i … S j ?是回文串? ?false,? ?其它情况? P(i, j)= \begin{cases}\text { true, } & \text { 如果子串 } S_{i} \ldots S_{j} \text { 是回文串 } \\ \text { false, } & \text { 其它情况 }\end{cases} P(i,j)={?true,??false,???如果子串?Si?Sj??是回文串??其它情况??

当且仅当 S i + 1 S_{i+1} Si+1? S j ? 1 S_{j-1} Sj?1?是回文串,即 P ( i + 1 , j ? 1 ) = t r u e P(i+1, j-1) =true P(i+1,j?1)=true,且 S i = = S j S_{i}==S_{j} Si?==Sj?时, P ( i , j ) = t r u e P(i, j)=true P(i,j)=true

P ( i , j ) = P ( i + 1 , j ? 1 ) ∧ ( S i = = S j ) P(i, j)=P(i+1, j-1) \wedge\left(S_{i}==S_{j}\right) P(i,j)=P(i+1,j?1)(Si?==Sj?)

对于所有是回文串的子串,记录其长度,选择最长的

代码如下:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        # 字符串长度小于2,则整个字符串都是回文串
        n = len(s)
        if n < 2:
            return s
        
        begin = 0
        maxlen = 1  # 任意一个元素都是回文串
        
        # 初始化,dp[i][j]表示s[i]...s[j]的子串是否是回文串
        dp = [[False]*n for _ in range(n)]
        for i in range(n):
            dp[i][i] = True
            # 任意一个元素s[i]都是回文串

        # 递推,遍历所有开始结束位置i,j。并判断是否是回文串
        for j in range(1,n):
            for i in range(j):
                if s[i] != s[j]:
                    # 首尾元素不相同,肯定不是回文串
                    dp[i][j] = False
                else:
                    if j-i < 3:
                        dp[i][j] = True
                        # 首尾元素相同,剩余部分少于一个元素
                    else:
                        dp[i][j] = dp[i+1][j-1]
                if dp[i][j] and j - i + 1 > maxlen:
                    # 记录最长的回文串索引
                    maxlen = j - i + 1
                    begin = i
        return s[begin:begin+maxlen]
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:41:03  更:2021-08-10 13:41:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:20:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码