当前位置:网站首页>力扣题(5)—— 最长回文子串
力扣题(5)—— 最长回文子串
2022-08-04 19:27:00 【世界的隐喻】
最长回文子串
题目内容
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindromic-substring
题解一:中心扩展法
构建一个【从中心往两边扩散】的函数——扩散的条件是,不超出边界且扩散的两边的元素相等,函数返回【回文字符串】。
对给定的字符串每个位置进行遍历,并且判断找到的回文字符串长度,返回最长的字符串。
需要注意的是,如果回文字符串长度是奇数,那么该字符串中间的字符并不会有回文字符,比如“bab”,a 只出现一次,但是该字符串仍然是回文字符串,偶数长度则正好相反,如“baab”。
class Solution:
def longestPalindrome(self, s: str) -> str:
res = ""
for i in range(0, len(s)):
a = self.findK(s, i, i) # 寻找长度是奇数的回文字符串
b = self.findK(s, i, i+1) # 寻找长度是oushu 的回文字符串
# 判断回文字符串长度
if len(b) > len(a):
if len(b) > len(res):
res = b
else:
if len(a) > len(res):
res = a
return res
def findK(self, s, left, right):
# 寻找回文字符串
ans = ""
while left >= 0 and right <= len(s) - 1 and s[left] == s[right]:
if left == right: # 寻找奇数回文字符串时,一开始的字符要添加,并且因为 左指针等于右指针,所以添加一遍就可以
ans = s[left]
else:
ans = s[left] + ans + s[right]
left -= 1
right += 1
return ans
力扣通过的时间是912 ms
题解二:动态规划
该题解文字使用力扣题解作者_Breiman的题解
定义状态:题目让我们求什么,就把什么设置为状态
题目求s中最长的回文子串,那就判断所有子串是否为回文子串,选出最长的
因此:dp[i][j]表示s[i:j+1]是否为回文子串(这里+1是为了构造闭区间)状态转移方程:对空间进行分类讨论(当前ij状态、过去ij状态 如何联合得到输出)
当前ij状态:头尾必须相等(s[i]==s[j]
)
过去ij状态:去掉头尾之后还是一个回文(dp[i+1][j-1] is True)
边界条件:只要是找过去ij状态的时候,就会涉及边界条件(即超出边界情况处理)
当i==j时一定是回文
j-1-(i+1)<=0,即j-i<=2时,只要当s[i]==s[j]时就是回文,不用判断dp[i+1][j-1]
dp[i][j] 为截取的子串输出内容:每次发现新回文都比较一下长度,记录i与长度
class Solution:
def longestPalindrome(self, s: str) -> str:
max_length = 0
res = ""
length = len(s)
# n * n 的矩阵,元素全是 False
dp = [[False] * length for i in range(length)]
if length == 1:
return s
for right in range(length):
for left in range(right+1):
index = right - left + 1
if index == 1:
dp[left][right] = True
elif index == 2:
dp[left][right] = (s[left] == s[right])
else:
dp[left][right] = (s[left] == s[right] and dp[left+1][right-1])
if dp[left][right]:
if max_length < index:
max_length = index
res = s[left: right+1]
return res
力扣通过的时间是4924 ms
边栏推荐
- WPF 多个 StylusPlugIn 的事件触发顺序
- 八一建军节 | 致敬中国人民解放军
- VQ Realization of Wavelet Extraction Features
- really time ntp服务启动命令
- 【ASP.NET Core】 中间件
- 5G NR 笔记记录
- 备忘录模式
- ACP-Cloud Computing By Wakin自用笔记(2)CPU和内存虚拟化
- QT 小知识随记
- VPC2187/8 current mode PWM controller 4-100VIN ultra-wide voltage startup, highly integrated power control chip recommended
猜你喜欢
随机推荐
03 ts类型缩小,函数
NLP技术为何在工业界这么卷?前沿案例解析来了
MogDB学习笔记-环境准备及单实例安装
工业相机CCD与CMOS
win10 uwp ping
How to add custom syntax to MySQL?
[Sql brush topic] Query information data--Day1
visual studio 与 visual studio code
哈佛架构 VS 冯·诺依曼架构
高效目标检测:动态候选较大程度提升检测精度(附论文下载)
WPF 元素裁剪 Clip 属性
《学会写作》粥佐罗著
电脑一键重装系统内存完整性无法打开怎么办
备忘录模式
STP实验
如果是测试 axi dma抓数的话 看这里
运维就业现状怎么样?技能要求高吗?
MySQL远程备份策略举例
直播回顾|7 月 Pulsar 中文开发者与用户组会议
ros2订阅esp32发布的电池电压数据-补充