问题来源:最长回文子串

问题描述:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

例子
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

1. O(n3)O(n^3)O(n3)算法

最简单也是最直观的做法是暴力算法。通过两层遍历,我们可以选出所有可能的子串,然后判断该子串是否是回文。

class Solution:def longestPalindrome(self, s: str) -> str:max_huiwen = ''for i in range(len(s)):for j in range(i+1, len(s)+1):# 判断s[i:j]是否是回文ss = s[i:j]if ss == ss[::-1]:if len(max_huiwen) < len(ss):max_huiwen = ssreturn max_huiwen

这种算法注定用时最长,可能超时。

2. O(n2)O(n^2)O(n2)算法

暴力算法实际上重复判断了很多子串,比如,我们判断“abcba”是否为回文,我们不但判断子串“abcba”是否为回文,也判断子串“bcb”是否为回文。实际上,我们在判断子串“bcb”是回文之后,应该保留这种信息,然后判断子串“abcba”是否为回文。

我们需要判断每个较小的子串是否为回文,基于此,我们进一步判断较长子串是否为回文。

动态规划适用条件是,该问题较大规模问题可以由较小问题解决,以及该问题有最优子结构,也就是说,该问题的最优解中包含子问题的最优解。可以看到,判断子串是否为回文,可以分解为子串的子串是否为回文。

动态规划有三点:状态定义状态转移方程边界值

  • 状态定义:d(i,j)d(i, j)d(i,j)存储bool值,用于判断子串s[i, j+1]是否为回文;
  • 状态转移方程:d(i,j)=(s[i]==s[j])and d(i+1,j−1)d(i, j) = (s[i]==s[j])~ \text{and}~ d(i+1, j-1)d(i,j)=(s[i]==s[j]) and d(i+1,j−1),意思是,字符串s[i, j+1]是否为回文,取决于1)字符串左右两端字符是否相等,即s[i]==s[j];且2)子串s[i+1, j-1]是否为回文;
  • 边界值:如果j==i,则d(i,j)=Trued(i, j)=\text{True}d(i,j)=True;如果j==i+1,那么只需判断字符串两端是否相同;如果j>=i+2,那么用状态转移方程判断

具体代码如下:

class Solution:def longestPalindrome(self, s: str) -> str:d = [[False for i in range(len(s))] for j in range(len(s))]# 子串长度i从1(自身)到len(s)for i in range(len(s)):# 给定长度i,子串从j开始for j in range(len(s)-i):if i == 0: # 子串长度为1d[j][j+i] = Trueelif i == 1: # 子串长度为2d[j][j+i] = (s[j] == s[j+i])else: # 子串长度为3及以上# 长度为i的子串变成长度为i-2的子串d[j][j+i] = (s[j] == s[j+i]) and d[j+1][j+i-1] #print(d)# 在二维数组d中,寻找值为True且col-row最大的项max_item = -1start, end = -1, len(s)for i in range(len(s)):for j in range(len(s)):if d[i][j] and j - i > max_item:max_item = j - istart, end = i, jreturn s[start:end+1]

最长回文子串--动态规划相关推荐

  1. 【字符串】最长回文子串 ( 动态规划算法 ) ★

    文章目录 一.回文串.子串.子序列 二.最长回文子串 1.动态规划算法 2.动态规划算法代码示例 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都 ...

  2. java最长回文子序列_LeetCode[5] - 最长回文子串动态规划

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: & ...

  3. 最长回文子串动态规划_九章算法 | 微软面试题:最长回文子串

    给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 在线评测地址:LintCode 领扣 样例 1: 输入:"abcdzdcab&quo ...

  4. 最长回文子串——动态规划

    动态规划思路 首先确定状态转移方程:数组S用来存储输入的字符串, 令dp[ i ] [ j ] 表示 S[ i ] 至 S[ j ] 所表示的子串是否是回文子串,是则为1,不是为0.这样根据S[ i ...

  5. LeetCode 5.最长回文子串(动态规划)

    题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意 ...

  6. 121. Leetcode 5. 最长回文子串 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j] 表示的是区间范围[i,j] 的子串是否是回文子串 步骤二.推断状态方程: 如果s[i] != s[j], 当前的dp[i][j] = Fa ...

  7. 动态规划-最长回文子串

    输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2:输入: "cbbd" 输出 ...

  8. 5. 最长回文子串——暴力法---动态规划解法---扩展中心法

    暴力法 动态规划解法 class Solution {public String longestPalindrome(String s) {if (s == null) return null;cha ...

  9. leetcode 5. 最长回文子串 暴力法、中心扩展算法、动态规划,马拉车算法(Manacher Algorithm)

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

最新文章

  1. GitLab CI流水线配置文件.gitlab-ci.yml详解(三)
  2. 手动修改oracle scn号,SCN(系统改变号)
  3. mysql从库并发连接_MYSQL从库的并发恢复
  4. AMPAS/ASC Common File Format LUT
  5. python 装饰器有哪些_python之装饰器
  6. 数据库Mysql的学习(六)-子查询和多表操作
  7. C++中STL-队列和优先队列
  8. vs2019安装python库_vs2019安装和使用详细图文教程
  9. for命令linux,linux命令:for循环(示例代码)
  10. jq.$post传递参数给php,通过URL参数post传递的实现方式 PHP/Javascript
  11. 【语音处理】基于matlab低通滤波器语音信号加噪与去噪【含Matlab源码 1709期】
  12. 三级计算机信息安全基础知识
  13. sqlserver数据库中批量写入海量数据
  14. 字符串分割 strsep 函数
  15. Vue3.0 + Echarts 实现地区人口数量分布展示
  16. 小程序js实现【数字变化动画效果】
  17. 容易上手的视频画面裁剪软件有哪些?来试试这几款吧
  18. loadrunner入门教程(31) --Analysis
  19. 他说:“程序员是出轨率最高群体”,然后就被解约了...
  20. 【深入kotlin】 - 与Java互操作:kotlin调用java

热门文章

  1. 目标检测——val集的作用
  2. Bash语言的学习笔记~(legacy)
  3. 支持向量机SVM的学习笔记
  4. 如何在gitee上部署网页
  5. ubuntu 远程连接服务器以及文件传输
  6. LLVM和clang
  7. Nginx配置https和wss
  8. Java中更换Map中的主键key的名称
  9. CSDN编辑器 修改代码颜色
  10. Android模拟器的换肤和Android学习资料下载