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

class Solution:def longestPalindrome(self, s):if (len(s) < 2):return sstart = 0  #记录最长回文子串开始的位置maxLen = 0 #记录最长回文子串的长度for i in range(len(s) - 1):for j in range(i,len(s)):#j从i开始,不从i+1开始,s=‘ac’就能选第一个‘a’# 法一:截取所有子串,然后在逐个判断是否是回文的# 法二(优化):截取所有子串,如果截取的子串小于等于之前遍历过的最大回文串,直接跳过。# 因为截取的子串即使是回文串也不可能是最大的,所以不需要判断if (j - i < maxLen):continueif self.isPalindrome(s, i, j) and  (maxLen < j - i + 1):# maxLen为最大长度时,后面maxLen<j-i+1 就为False,能保证截取最长回文字符串start = imaxLen = j - i + 1return s[start:start + maxLen]# 判断是否是回文串def isPalindrome(self,s,start,end):while (start < end) :if s[start] != s[end]:return Falsestart += 1end -= 1return Trues =   "ac"
S = Solution()
result = S.longestPalindrome(s)
print(result)

2.中心扩散法
     从左向右遍历:选择一个中心点向两侧扩展,分别考虑奇数组合偶数组的情况。

class Solution:def longestPalindrome(self, s: str) -> str:#  判断空字符串的情况if (s == ""):return ""result = ""sSize = len(s)# 选择一个中心点,向两侧扩展for i in range(sSize):# 奇数组情况tmpStr = self.expandHelper(s, i, i)# 偶数组情况tmpStr2 = self.expandHelper(s, i, i + 1)if len(tmpStr) > len(result):result = tmpStrif len(tmpStr2) > len(result):result = tmpStr2return resultdef expandHelper(self,s,left,right):sSize = len(s)while (left >= 0 and right < sSize and s[left] == s[right]):left -= 1right += 1# 小心s[left] != s[right]return s[(left + 1) : right]s = "aaaabad"
S = Solution()
result = S.longestPalindrome(s)
print(result)

3.动态规划

思路与算法

对于一个子串而言,如果它是回文串,并且长度大于 22,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 "ababa'',如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串,这是因为它的首尾两个字母都是 “a”。

      注意:在状态转移方程中,我们是从长度较短的字符串向长度较长的字符串进行转移的,因此一定要注意动态规划的循环顺序。

class Solution:def longestPalindrome(self, s):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] = Falseelse:if j - i < 3:dp[i][j] = Trueelse:dp[i][j] = dp[i + 1][j - 1]#只有dp[0][4]是True,dp[1][3]还是True……,这才是真正的回文串# dp[i][j] = True #假如s="abaa",s[0]=s[4], d[0][4]=True,就被认为是回文串,跳入下一个环节# 只要 dp[i][L] == true 成立,就表示子串 s[i..L] 是回文,此时记录回文长度和起始位置if dp[i][j] and j - i + 1 > max_len:max_len = j - i + 1begin = ireturn s[begin:begin + max_len]s = "abaa"
S = Solution()
result = S.longestPalindrome(s)
print(result)

Python最长回文子串相关推荐

  1. python最长回文子串leetcode_Python版LeetCode5. 最长回文子串

    本文转载自[微信公众号:机器学习算法与Python精研,ID:AITop100]经微信公众号授权转载,如需转载与原文作者联系 题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. leetcode 5 :Longest Palindromic Substring 找出最长回文子串

    题目: Given a string S, find the longest palindromic substring in S. You may assume that the maximum l ...

最新文章

  1. java main生命周期_Java从入门到入土(62)线程的生命周期
  2. for、for / in循环
  3. 使用Deinstall专用工具删除Oracle Database
  4. 说说JSON和JSONP,也许你会豁然开朗,含jQuery使用jsonp用例
  5. android 文件选择器_Android 开发 打开系统文件、图片、视频等 实现单选多选功能...
  6. 【转】RabbitMQ六种队列模式-1.简单队列模式
  7. linux火狐自动更新,CentOS 7手动更新firefox | Linux系统运维联盟
  8. 计算ndvi值需要的数据_ENVI中计算植被覆盖指数
  9. 管理员运行bat文件获取当前目录和上级目录
  10. 【USACO】回文平方数
  11. 微博用户信息源代码爬取_爬取微博用户公开信息,分析为周杰伦打榜的夕阳红老年团,告诉你他们真实年龄!...
  12. UML图详细图文教程
  13. OpenCV项目实战
  14. iscript脚本截取字符串
  15. 好看的微信忧心文案小程序源码 文案+头像+背景图
  16. 固态硬盘读写速度快的原理是什么?
  17. java计算机毕业设计高原特色农产品网站设计MyBatis+系统+LW文档+源码+调试部署
  18. 值得关注的IT技术博客
  19. 随机数生成器(结绳中文app编程)
  20. Python中的decimal.Decimal类型和整型相乘后还是decimal.Decimal类型

热门文章

  1. latch: cache buffers chains latch: ges resource hash list
  2. 用几何画板画七边形的方法
  3. topic是短语还是句子_八年级上册英语Unit2  Topic1重点短语、句子、语法
  4. mysql安全实验测验答案_实验三_数据库安全性实验报告.doc
  5. linux查看文件的特殊权限,linux文件的特殊权限及隐藏权限
  6. UVALive 4513 Stammering Aliens
  7. Vue项目学习(2)
  8. 数据可视化(Echarts、antv)
  9. Websocket-sharp重连机制解决方案
  10. educode寄存器设计与应用之循环移位寄存器的设计、并行存取的移位寄存器的设计(在Logisim上实现)