当前位置:网站首页>力扣题(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
边栏推荐
猜你喜欢
随机推荐
The Development and Current Situation of Object Detection
03 ts类型缩小,函数
使用.NET简单实现一个Redis的高性能克隆版(二)
【最新资讯】2022下半年软考新增2个地区公布报名时间
Openharmony code framework (2) the person that
网络运维管理从基础到实战-自用笔记(1)构建综合园区网、接入互联网
密码学系列之:PEM和PKCS7,PKCS8,PKCS12
MMDetection usage example: from entry to exit
完善的交叉编译环境记录 peta 生成的shell 脚本
四维图新:子公司首款功能安全 MCU 芯片已陆续送样
华为企业组网实例:VRRP+MSTP典型组网配置
VQ Realization of Wavelet Extraction Features
Storage resource activation system to help new infrastructure
元国度链游系统开发
awk 统计差值记录
Openharmony first experience (1)
T+Cloud: A "Smart Company" for Building New Business Social Networks and Marketing Relationships
SIGIR 2022 | 邻域建模Graph-Masked Transformer,显著提高CTR预测性能
宏定义小方法
win10 uwp MVVM 语义耦合









