文巾解题 5. 最长回文子串
1 题目描述
2 解题思路
2.1 动态规划
对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。
例如对于字符串 “ababa”,如果我们已经知道 首尾元素都是回文串,那么“bab” 一定是回文串。
也就是说,如果 s[i+1:j−1] 是回文串,并且 s[i]=s[j],那么s[i:j] 是回文串。
上文的所有讨论是建立在子串长度大于 2 的前提之上的,我们还需要考虑动态规划中的边界条件,即子串的长度为 1 或 2。
对于长度为 1 的子串,它显然是个回文串。
对于长度为 2 的子串,只要它的两个字母相同,它就是一个回文串。
因此我们就可以写出动态规划的边界条件:
根据这个思路,我们就可以完成动态规划了,最终的答案即为所有P(i,j)=true 中j−i+1(即子串长度)的最大值。
class Solution:def longestPalindrome(self, s: str) -> str:n=len(s)if(len(s)<2):return s#如果字符串有一个或者零个元素,那么这个字符串肯定是回文串maxLen=1 #最长回文子串的长度begin=0#最长回文子串的起始位置dp=[[False]*n for _ in range(n)]#dp是一个n*n的数组,dp[i][j]表示[i,j]部分的s是不是回文串for i in range(n):dp[i][i]=True#[i,i]部分(也就是子串长度为1)一定是回文串for L in range(2,n+1):#从小到大枚举子串的长度(长度为1的都是True,前面已经考虑过了)for i in range(n):#遍历起始位置j=i-1+L#j-i+1=L -> j=i-1+L#我们目前考虑的字串的终止位置if(j>=n):break
#如果终止位置超过边界了,那么我们就考虑更长一格的字符串,再从坐标0开始考虑;
#当前字符串长度停止继续遍历起始位置(因为之后起始位置对应的终止位置也是越界的)
#因为我们是左闭右闭,所以终止条件是j≥n而不是j>nif(s[i]!=s[j]):pass#如果起止元素不相等,那么[i,j]不是回文串else:if(L==2 or L==3):dp[i][j]=True
#如果此时我们考虑的字符串长度是2或者3,那么起止元素相等后,
#中间只”夹“着零个或者一个元素,那么此时[i,j]是回文数else:dp[i][j]=dp[i+1][j-1]#不然的话,[i,j]是不是回文数取决于[i+1,j-1]是不是回文数if(dp[i][j]==True and L>maxLen):maxLen=Lbegin=i
#如果此时我们遍历到的回文子串长度比目前为止遍历到的回文子串长,
#那么更新此时的回文子串起始位置和长度return s[begin:begin+maxLen]
2.2 中心扩展
我们观察一下2.1中的状态转移方程
我们可以看到其中的状态转移链:
可以发现,所有的状态在转移的时候的可能性都是唯一的。也就是说,我们可以从每一种边界情况开始「扩展」,也可以得出所有的状态对应的答案。
边界情况即为子串长度为 1或 2 的情况。我们枚举每一种边界情况,并从对应的子串开始不断地向两边扩展。如果两边的字母相同,我们就可以继续扩展,例如从 P(i+1,j−1) 扩展到 P(i,j);如果两边的字母不同,我们就可以停止扩展,因为在这之后的子串都不能是回文串了。
我们枚举所有的长度为1或者2并尝试「扩展」,直到无法扩展为止,此时的最长回文串即是最终的答案。
class Solution:def expand_around_center(self,s,left,right):l=len(s)while(left>=0 and right<=l-1 and s[left]==s[right]):
#如果此时子串的左边界和右边界没有越界,而且我们此时左边界和右边界的值是相等的
#那么我们将考虑的子串向外扩张“一圈”,继续讨论。如此往复,直到至少不满足这三个条件的一个left=left-1right=right+1return(left+1,right-1)
#因为我们最后考虑的左右边界是至少不满足三个条件之一的,
#所以我们左边界右边界要向内“缩一格”,此时的子串是我们当前扩展到的最大回文串def longestPalindrome(self, s: str) -> str:start=0end=0#start,end是我们最长回文子串的起止位置l=len(s)for i in range(l):#遍历所有初始回文子串的左边界left1,right1=self.expand_around_center(s,i,i+1)left2,right2=self.expand_around_center(s,i,i)if(right1-left1>end-start):end=right1start=left1if(right2-left2>end-start):end=right2start=left2return(s[start:end+1])
文巾解题 5. 最长回文子串相关推荐
- java最长回文子序列_LeetCode[5] - 最长回文子串动态规划
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: & ...
- python求回文_python实现求最长回文子串长度
给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...
- 字符串处理 —— 回文串相关 —— 求最长回文子串
[暴力枚举] 求最长回文串最容易的方法就是暴力枚举,求出字符串的每一个子串,然后判断是不是回文,找到最长的那个回文串 求每一个子串的时间复杂度为 O(N^2),判断一个子串是不是回文时间复杂度为 O( ...
- 文巾解题 14. 最长公共前缀
1 题目描述 2 解题思路 2.1 排序后首尾的最大公共序列 首尾元素公共的部分,夹在他们中间的其他元素肯定也由这些公共前缀.3 class Solution:def longestCommonPre ...
- 文巾解题1143. 最长公共子序列
1 题目描述 2 解题思路 我们可以用动态规划解决这个问题. 假设我们用坐标i表示当前遍历到的text1的坐标,j表示当前遍历到的text2的坐标.ret[i][j]表示text1遍历到i,text2 ...
- LeetCode解题记录(409)——最长回文串
LeetCode解题记录--最长回文串 题目描述 示例 题目理解 解题思路 题目描述 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比 ...
- 文巾解题 477. 汉明距离总和
1 题目描述 2 解题思路 2.1 暴力两两比较 两个数字之间的汉明距离可以使用 文巾解题 461. 汉明距离_刘文巾的博客-CSDN博客 中的任何一种方法,但是因为这个是两两比较,时间复杂度比较高, ...
- 最长回文子串和回文链表
回文子串和回文链表 文章目录 回文子串和回文链表 一.最长回文子串 1.题目描述 2.分析 3.代码实现 二.判断回文链表 1.问题描述 2. 分析 3.代码 4.优化 三.回文子串 1.问题描述 2 ...
- 最长回文子串 C++
在一个字符串中要到最长的回文子串,有如下方案,代码在最后. 最长回文子串的相关博文 1.暴力法 最容易想到的就是暴力破解,求出每一个子串,之后判断是不是回文,找到最长的那个. 求每一个子串时间复杂度O ...
最新文章
- 大家都来说说为什么要学习jQuery Mboile?
- mfc中picture control的用法_可能是最被误用的 HTTP 响应头之一 Cache-Control: must-revalidate
- 关于SAP Router连接不稳定的改良
- 【Swift】在Swift中获取当前的wifi SSID
- 使用DataTable作为存储过程的参数
- jQuery 五角星评分
- No such file or dirctionary:/ufeff.....关于ufeff错误的解决办法
- c语言z基本数据类型文档,C语言基本数据类型
- 在centos7中安装nodejs(npm )
- .NET 漫淡(一) --- 需要充分认识的应用程序域-AppDomain
- rostcm6情感分析案例分析_情感分析师在线指导情感挽回
- idea2021.3.2版本下载及安装教程
- js动态显示实时时间
- 创新案例分享 | 升级改造干部档案管理系统,精确剖析干部执行力情况
- web前端入坑系列回归,再推荐一波学习资源
- 环保公司网站的设计与制作
- 锂电池充电过程的四个阶段
- Oracle ADG状态查看与相关视图
- postgis版本升级
- 连通集(浙大数据结构习题)