1.动态规划 时间复杂度O(n^2) 空间复杂度O(n^2)
大体思路就是
如果 "aba"是回文的 那么"aabaa" 也一定是回文的 因为就是在两边加上了相同的
所以从最小的 "a" "aa" "aba" 这种开始 逐渐扩张 找到最大的一个
class Solution:
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
matrix = [[0 for i in range(len(s))]for i in range(len(s))]
longestStr=""
longestLen=0
if len(s)==1:
return s[0]
# i在右边
for j in range(len(s)):
for i in range(0,j+1):
if s[i]==s[j]:
# 包含一元二元三元
if j-i<=1:
matrix[i][j]=1
if longestLen<(j-i+1):
longestLen=j-i+1
longestStr=s[i:j+1]
# 扩张
else:
if matrix[i+1][j-1]==1:
matrix[i][j]=1
if longestLen<(j-i+1):
longestLen=j-i+1
longestStr=s[i:j+1]
return longestStr
2.但是第一种方法用上了二维数组所以内存占用很大
所以改进后空间复杂度为O(n)更实用
class Solution:
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
n=len(s)
olist=[0]*n
nlist=[0]*n
longestLen=0
longestStr=""
for j in range(n):
for i in range(0,j+1):
# 包含一元二元三元
if s[i]==s[j]:
# 当 j 时,第 i 个子串为回文子串
if j-i<=1:
nlist[i]=1
if longestLen < j-i+1:
longestLen = j-i+1
longestStr = s[i:j+1]
else:
# 当j-i>1时,判断当j-1时,第i+1个子串是否为回文子串
if olist[i+1]==1:
nlist[i]=1
if longestLen<(j-i+1):
longestLen=j-i+1
longestStr=s[i:j+1]
olist=nlist
nlist=[0]*n
return longestStr