使用动态规划法,构建转移矩阵,对于单个字符其dp肯定为1,对于包含两个字符的字符串,如果这两个字符相等则该zi字符串是回文串。以此类推,要使dp[i][j]=1则必须满足s[i]==s[j] and dp[i+1][j-1]==1,即如果子串s[i+1:j]是回文串又字符串的首字符和尾字符相等,则字符串s[i:j+1]一定是回文串。不过python超时。
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
len_s = len(s)
start = 0
longest = 1
if len_s == 0 or len_s == 1:
return s
dp = []
for i in range(len_s):
temp = []
for j in range(len_s):
temp.append(0)
dp.append(temp)
for i in range(len_s):
dp[i][i] = 1
if i < len_s - 1:
if s[i] == s[i + 1]:
dp[i][i + 1] = 1
start = i
longest = 2
for l in range(3, len_s + 1):
for i in range(len_s):
if i + l - 1 < len_s:
j = i + l - 1
if s[i] == s[j] and dp[i + 1][j - 1] == 1:
dp[i][j] = 1
start = i
longest = l
return s[start:start + longest]