1.题目描述
给你一个字符串 s
,找到 s
中最长的 回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
2.题目分析
对于回文子串的情况,我们可以分成三种情况讨论
1.最长子串长度为1,这种情况要么是字符长度为1,要么是不存在回文的情况
2.最长子串长度为2,那么我们只用判断这个字符和它的下一个相等即可
3.最长子串长度大于2,那么对于长度大于2的子串,如果它的首尾字符相等(s[i] == s[j]
),并且去掉首尾字符的子串(即 dp[i+1][j-1]
)也是回文,那么整个子串就是回文。因此,状态转移方程为:dp[i][j] = (s[i] == s[j]) and dp[i+1][j-1]
。
3.代码实现
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
#如果字符串只有一个元素,那么我们直接返回它即可
if n < 2:
return s
#设置一个初始值都为False的二位布尔矩阵,如果发现回文,则设置为true dp[i][j] 表示 s[i:j+1] 是否为回文子串
dp = [[False] * n for _ in range(n)]
max_len = 1 # 最长回文子串的长度
start = 0 # 最长回文子串的起始位置
# 初始化单个字符为回文
for i in range(n):
dp[i][i] = True
# 检查长度为2的子串
for i in range(n - 1):
if s[i] == s[i + 1]:
dp[i][i + 1] = True
max_len = 2
start = i
# 检查长度大于2的子串
for length in range(3, n + 1):
for i in range(n - length + 1):
j = i + length - 1
if s[i] == s[j] and dp[i + 1][j - 1]:
dp[i][j] = True
if length > max_len:
max_len = length
start = i
# 切片返回最长回文子串
return s[start:start + max_len]
4..吐槽
啊啊,力扣第四题太难了,弄不明白,留给以后的我再去烦脑吧,今天让我们先来学习一下第五题——最长回文子串吧