题目描述
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
思路
二维dp,还是去往二维数组里填数字,这次填的是bool型。
- 当只有一个字符时,最长回文子串就是它本身
- 创建一个全为False的二维数组
- 初始化第0行0列为True,因为要返回的并不是bool,所以还需创建一个列表,来保存最长回文子串,初始值为s[0]
- 之后就是填表了,因为第0行0列已经填完了,我们的循环就从r==1开始(l,r为闭合区间,因为l要小于r,所以第一个for循环是r的),第二个for循环就是l在r的范围内从左往右走
- 当s[l]==s[r],我们可以看出它们的这个区间是有可能成为最长回文子串,但还需进一步确认
- 先判断如果l与r的区间大小只有他俩或者他俩指的是同一个值,即可说明该区间为一个回文子串
- 另一种情况就是,dp[l+1][r-1],它区间内的上一轮是回文子串,则也说明当前是回文子串
- 记录当前回文子串的长度,与之前保存的最长做对比,如果比之前的长,即记录当前最长回文子串的区间
- 最后,返回最长的区间即可
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
if len(s)<=1:
return s
dp=[[False]*len(s) for _ in range(len(s))]
dp[0][0]=True
res=s[0]
longest=1
for r in range(1,len(s)):
for l in range(r):
if s[l]==s[r] and (r-l<=2 or dp[l+1][r-1]):
dp[l][r]=True
curlen=r-l+1
if curlen>longest:
longest=curlen
res=s[l:r+1]
return res