题目
分析
以baacac为例,构造dp[j][i],表示从j到i子串是否为回文序列。因为i==j时是单个字符,一定是回文串,所以dp[j][i]的对角线一定是True。
当s[j]!=s[i]时,当前子串s[j:i]一定不是回文串。比如s[0:3]
当s[j]==s[i]时,如果s[j:i]长度为2,一定是回文串比如s[1:2]
当s[j]==s[i]且子串长度大于2,则依据s[j+1:i-1]判断s[j:i]是不是回文串。比如s[3:5]或者s[2:4]。
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
T | F | F | F | F | F |
F | T | T | F | F | F |
F | F | T | F | T | F |
F | F | F | T | F | T |
F | F | F | F | T | F |
F | F | F | F | F | T |
Python代码
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if not s: return ""
if len(s)<=1: return s
max_len = 1
begin = 0
dp= [[False]*len(s) for i in range(len(s))]
for i in range(len(s)):
dp[i][i] = True
for i in range(1,len(s)):# 列
for j in range(0,i):# 行
if s[i]!=s[j]:
dp[j][i] = False
else:
if i-j+1<3:
dp[j][i] = True
else:
dp[j][i] = dp[j+1][i-1]
if dp[j][i]:
if i-j+1>max_len:
begin = j
max_len = i-j+1
return s[begin:begin+max_len]