给一个字符串 s,找到 s 中最长的回文子串。
示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。

示例 2:

输入:s = “cbbd”
输出:“bb”

示例 3:

输入:s = “a”
输出:“a”

示例 4:

输入:s = “ac”
输出:“a”

思路一:中心扩散,如果两边的字母相同,就可以继续扩展;如果两边的字母不同,就停止扩展。

class Solution:def longestPalindrome(self,s):start, end = 0, 0for i in range(len(s)):l1, r1 = self.expandAroundCenter(s, i, i)  # 中心为奇数      b a bl2, r2 = self.expandAroundCenter(s, i, i + 1)  # 中心为偶数  b aa bif r1 - l1 > end - start:start, end = l1, r1if r2 - l2 > end - start:start, end = l2, r2return s[start:end + 1]def expandAroundCenter(self,s, l, r):while l >= 0 and r < len(s) and s[l] == s[r]:  # 字母相同,继续扩展l -= 1r += 1return l + 1, r - 1  # 返回下标if __name__ == '__main__':s = "babad"sl  = Solution()print(s.longestPalindrome(s))

思路二:动态规划
1、dp[i][j]数组:表示区间范围[i,j] (左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。
2、递推:dp[i][j] 是回文,那么只有当s[i] == s[j] 时,dp[i+1][j-1] = true(是回文串)。当对于长度为 1 的子串,显然是个回文串;对于长度为 2 的子串,只要两个字母相同,就是一个回文串。

 if s[i] == s[j]:if j - i <= 1:  # 子串长度为1或2dp[i][j] = Trueelif dp[i+1][j-1]:dp[i][j] = Trueif dp[i][j] and j - i > r - l:  # dp[i][j] 是回文,记录边界l, r = i, j

3、dp数组初始化:全为False
4、遍历顺序:
    a、以矩阵来看,如果是从上到下,从左到右遍历(顺序遍历),那么会用到没有计算过dp[i + 1][j - 1],也就是根据不确定是不是回文的区间[i+1,j-1],来判断[i,j]是不是回文,那结果一定是不对的。所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的。
    b、以动态子串:动态规划的边界条件就是子串长度为1或2,从长度较短的字符串向长度较长的字符串进行转移的,dp[i + 1][j - 1]为较短的子串,可以使用,枚举子串长度即可。

"""a、矩阵"""
def dp(s):lenth = len(s)l, r= 0, 0dp = [[False] * lenth for i in range(lenth)]for i in range(lenth - 1, -1,-1):for j in range(i,lenth):if s[i] == s[j]:if j - i <= 1:dp[i][j] = Trueelif dp[i+1][j-1]:dp[i][j] = Trueif dp[i][j] and j - i > r - l:l, r = i, jreturn s[l:r+1]
"""b、子串长度"""
def dp(s: str) -> str:n = len(s)if n < 2:return smax_len = 1begin = 0# dp[i][j] 表示 s[i..j] 是否是回文串dp = [[False] * n for _ in range(n)]for i in range(n):dp[i][i] = True# 递推开始# 先枚举子串长度for L in range(2, n + 1):# 枚举左边界,左边界的上限设置可以宽松一些for i in range(n):# 由 L 和 i 可以确定右边界,即 j - i + 1 = L 得j = L + i - 1# 如果右边界越界,就可以退出当前循环if j >= n:breakif s[i] != s[j]:dp[i][j] = False else:if j - i < 3:dp[i][j] = Trueelse:dp[i][j] = dp[i + 1][j - 1]# 只要 dp[i][L] 是回文,记录回文长度和起始位置if dp[i][j] and j - i + 1 > max_len:max_len = j - i + 1begin = ireturn s[begin:begin + max_len]

最长回文子串(Python)相关推荐

  1. LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)

    Longest Palindromic Substring 最长回文子串 学习笔记 1. Brute method 第一种方法:直接循环求解,o(n2)o(n^2) class Solution:de ...

  2. leetcode--最长回文子串--python

    文章目录 题目 题目详情 示例 解题思路 思路 代码 运行结果 最佳方案 题目 题目详情 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 输入: &qu ...

  3. 最长回文子串Python解法

    给你一个字符串 s,找到 s 中最长的回文子串. 列: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答 ...

  4. python求回文_python实现求最长回文子串长度

    给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...

  5. python【力扣LeetCode算法题库】5- 最长回文子串

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

  6. LeetCode5-最长回文子串原理及Python实现

    LeetCode5(medium)-最长回文子串 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 思路 中心扩展法 遍历字符串,依次把每个字符作为中心. ...

  7. 最大子串和 python_5. 最长回文子串(Python)

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

  8. python 面试题 aac caa相似_经典面试题:最长回文子串

    回文串是面试常常遇到的问题(虽然问题本身没啥意义),本文就告诉你回文串问题的核心思想是什么. 首先,明确一下什:回文串就是正着读和反着读都一样的字符串. 比如说字符串aba和abba都是回文串,因为它 ...

  9. Python最长回文子串

    1.暴力解法(Brute Method)        暴力求解是最容易想到的,要截取字符串的所有子串,然后再判断这些子串中哪些是回文的,最后返回回文子串中最长的即可. 这里我们可以使用两个变量,一个 ...

  10. python生成回文字符串_回文字符串最长回文子串和子序列 - Python

    Palindrome 回文字符串就是指从前往后和从后往前读,都是一样的,比如"aabcbaa". 注意区分子串和子序列,子串是连续的,子序列可以不连续 题型1:判断字符串是否为回文 ...

最新文章

  1. 简化PHP开发的10个工具
  2. 小白如何学3D建模?从零开始变大神,学习记录手册(必备)
  3. java在微信的应用_java版微信公众平台消息接口应用示例
  4. 小组作业:学生信息管理系统需求分析
  5. CAD标注快捷键有哪些?CAD标注快捷键命令大全
  6. 随机效应估算与固定效应估算_混合效应模型和面板数据分析zz Flona
  7. 天刀显示服务器失败,天涯明月刀手游提示安装失败怎么办 10月16日开服常见问题FAQ...
  8. android 动画入门(一)
  9. 17AHU排位赛2 F题(bitset优化)
  10. 不小心误删@‘local’操作恢复
  11. Win系统 - 系统双击文件总弹出属性窗口如何解决?
  12. 关于U盘文件消失,但是内存还在的情况。
  13. 程序员眼中的中国传统文化-王阳明《传习录》22
  14. python-Matplotlib图形上添加箭头指示
  15. 细分领域BIM系统研发是谁的事?
  16. 超全总结!详解计算机视觉中的特征点检测:Harris / SIFT / SURF / ORB
  17. Python | 宝爸宝妈不用愁,怎样给宝宝取个好名字?
  18. scrapy爬取起点中文网24小时热销榜单
  19. 搭建一个游戏平台运营团队都需要什么?
  20. 科学解析wifi过敏症

热门文章

  1. python抓取淘宝关键字信息
  2. PartyOK酒吧游戏实用手册
  3. 如何查看端口状态及端口占用情况
  4. FontMetrics
  5. 多张照片拼成另一个照片-想制作一个不一样的惊喜?还得用这款神器 AndreaMosaic,我们就叫它拼凑图片神器
  6. 【快应用】小程序转快应用如何退出整个快应用
  7. 【Shell秒懂系列】引用及转义(单引号/双引号/反斜杠/反引号)
  8. 奥的斯服务器显示DBF,OTIS故障代码故障总汇01.doc
  9. Error Correction
  10. 【干货教程】如何用Python优雅地绘制中国的地图