class Solution:
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
# dp
ans = ''
max_len = 0
n = len(s)
DP = [[0] * n for _ in range(n)]
# base cases
# 对角线以及它上面的那趟已知,矩阵左下角没有值因为i<=j
for i in range(n):
DP[i][i] = True
max_len = 1
ans = s[i]
for i in range(n-1):
if s[i] == s[i+1]:
DP[i][i+1] = True
ans = s[i:i+2]
max_len = 2
# state transition function
# 由于计算[i][j]需要[i+1][j-1]即左下角,由base推导则需要按列遍历。最大的行比列少2
for j in range(2, n):
for i in range(0, j-1):
if s[i] == s[j] and DP[i+1][j-1]:
DP[i][j] = True
if max_len < j - i + 1:
ans = s[i:j+1]
max_len = j - i + 1
return ans