版权声明:转载请记得声明 https://blog.csdn.net/qq_39268193/article/details/80386229
题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例1
输入: "babad"
输出: "bab"
注意: "aba"也是一个有效答案。
示例2
输入: "cbbd"
输出: "bb"
解析
动态规划
基本思路是对任意字符串,如果头和尾相同,那么它的最长回文子串一定是去头去尾之后的部分的最长回文子串加上头和尾。如果头和尾不同,那么它的最长回文子串是去头的部分的最长回文子串和去尾的部分的最长回文子串的较长的那一个。
P[i,j]表示第i到第j个字符的回文子串数
dp[i,i]=1
dp[i,j]=dp[i+1,j−1] + 2 if s[i] = s[j]
dp[i,j]=max(dp[i+1,j], dp[i,j−1]) if s[i] != s[j]
我的代码
class Solution:
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
n = len(s)
max_len = 0
start = 0
for i in range(n):
if i - max_len >= 1 and s[i-max_len-1: i + 1] == s[i-max_len-1: i+1][::-1]:
start = i - max_len - 1
max_len += 2
continue
if i - max_len >= 0 and s[i-max_len:i + 1] == s[i-max_len: i+1][::-1]:
start = i-max_len
max_len += 1
return s[start: start + max_len]