最长回文子串(Python)
给一个字符串 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)相关推荐
- LeetCode 5. Longest Palindromic Substring 最长回文子串 Python 四种解法(Manacher 动态规划)
Longest Palindromic Substring 最长回文子串 学习笔记 1. Brute method 第一种方法:直接循环求解,o(n2)o(n^2) class Solution:de ...
- leetcode--最长回文子串--python
文章目录 题目 题目详情 示例 解题思路 思路 代码 运行结果 最佳方案 题目 题目详情 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 输入: &qu ...
- 最长回文子串Python解法
给你一个字符串 s,找到 s 中最长的回文子串. 列: 输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答 ...
- python求回文_python实现求最长回文子串长度
给定一个字符串,求它最长的回文子串长度,例如输入字符串'35534321',它的最长回文子串是'3553',所以返回4. 最容易想到的办法是枚举出所有的子串,然后一一判断是否为回文串,返回最长的回文子 ...
- python【力扣LeetCode算法题库】5- 最长回文子串
5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...
- LeetCode5-最长回文子串原理及Python实现
LeetCode5(medium)-最长回文子串 题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 思路 中心扩展法 遍历字符串,依次把每个字符作为中心. ...
- 最大子串和 python_5. 最长回文子串(Python)
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 示例 1: 输入: "babad" 输出: "bab" 注 ...
- python 面试题 aac caa相似_经典面试题:最长回文子串
回文串是面试常常遇到的问题(虽然问题本身没啥意义),本文就告诉你回文串问题的核心思想是什么. 首先,明确一下什:回文串就是正着读和反着读都一样的字符串. 比如说字符串aba和abba都是回文串,因为它 ...
- Python最长回文子串
1.暴力解法(Brute Method) 暴力求解是最容易想到的,要截取字符串的所有子串,然后再判断这些子串中哪些是回文的,最后返回回文子串中最长的即可. 这里我们可以使用两个变量,一个 ...
- python生成回文字符串_回文字符串最长回文子串和子序列 - Python
Palindrome 回文字符串就是指从前往后和从后往前读,都是一样的,比如"aabcbaa". 注意区分子串和子序列,子串是连续的,子序列可以不连续 题型1:判断字符串是否为回文 ...
最新文章
- 简化PHP开发的10个工具
- 小白如何学3D建模?从零开始变大神,学习记录手册(必备)
- java在微信的应用_java版微信公众平台消息接口应用示例
- 小组作业:学生信息管理系统需求分析
- CAD标注快捷键有哪些?CAD标注快捷键命令大全
- 随机效应估算与固定效应估算_混合效应模型和面板数据分析zz Flona
- 天刀显示服务器失败,天涯明月刀手游提示安装失败怎么办 10月16日开服常见问题FAQ...
- android 动画入门(一)
- 17AHU排位赛2 F题(bitset优化)
- 不小心误删@‘local’操作恢复
- Win系统 - 系统双击文件总弹出属性窗口如何解决?
- 关于U盘文件消失,但是内存还在的情况。
- 程序员眼中的中国传统文化-王阳明《传习录》22
- python-Matplotlib图形上添加箭头指示
- 细分领域BIM系统研发是谁的事?
- 超全总结!详解计算机视觉中的特征点检测:Harris / SIFT / SURF / ORB
- Python | 宝爸宝妈不用愁,怎样给宝宝取个好名字?
- scrapy爬取起点中文网24小时热销榜单
- 搭建一个游戏平台运营团队都需要什么?
- 科学解析wifi过敏症