最长回文子串--动态规划
问题来源:最长回文子串
问题描述:给定一个字符串 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.动态规划算法 2.动态规划算法代码示例 一.回文串.子串.子序列 " 回文串 ( Palindrome ) " 是 正反都 ...
- java最长回文子序列_LeetCode[5] - 最长回文子串动态规划
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: & ...
- 最长回文子串动态规划_九章算法 | 微软面试题:最长回文子串
给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 在线评测地址:LintCode 领扣 样例 1: 输入:"abcdzdcab&quo ...
- 最长回文子串——动态规划
动态规划思路 首先确定状态转移方程:数组S用来存储输入的字符串, 令dp[ i ] [ j ] 表示 S[ i ] 至 S[ j ] 所表示的子串是否是回文子串,是则为1,不是为0.这样根据S[ i ...
- LeetCode 5.最长回文子串(动态规划)
题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意 ...
- 121. Leetcode 5. 最长回文子串 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i][j] 表示的是区间范围[i,j] 的子串是否是回文子串 步骤二.推断状态方程: 如果s[i] != s[j], 当前的dp[i][j] = Fa ...
- 动态规划-最长回文子串
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案. 示例 2:输入: "cbbd" 输出 ...
- 5. 最长回文子串——暴力法---动态规划解法---扩展中心法
暴力法 动态规划解法 class Solution {public String longestPalindrome(String s) {if (s == null) return null;cha ...
- leetcode 5. 最长回文子串 暴力法、中心扩展算法、动态规划,马拉车算法(Manacher Algorithm)
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000.示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
最新文章
- GitLab CI流水线配置文件.gitlab-ci.yml详解(三)
- 手动修改oracle scn号,SCN(系统改变号)
- mysql从库并发连接_MYSQL从库的并发恢复
- AMPAS/ASC Common File Format LUT
- python 装饰器有哪些_python之装饰器
- 数据库Mysql的学习(六)-子查询和多表操作
- C++中STL-队列和优先队列
- vs2019安装python库_vs2019安装和使用详细图文教程
- for命令linux,linux命令:for循环(示例代码)
- jq.$post传递参数给php,通过URL参数post传递的实现方式 PHP/Javascript
- 【语音处理】基于matlab低通滤波器语音信号加噪与去噪【含Matlab源码 1709期】
- 三级计算机信息安全基础知识
- sqlserver数据库中批量写入海量数据
- 字符串分割 strsep 函数
- Vue3.0 + Echarts 实现地区人口数量分布展示
- 小程序js实现【数字变化动画效果】
- 容易上手的视频画面裁剪软件有哪些?来试试这几款吧
- loadrunner入门教程(31) --Analysis
- 他说:“程序员是出轨率最高群体”,然后就被解约了...
- 【深入kotlin】 - 与Java互操作:kotlin调用java