代码随想录算法训练营Day 56| 动态规划part17 | 647. 回文子串、5. 最长回文子串、516.最长回文子序列
647. 回文子串
题目链接
一、法一
class Solution(object):
def countSubstrings(self, s):
"""
:type s: str
:rtype: int
"""
dp=[[False]*len(s) for _ in range(len(s))]
res=0
for i in range(len(s)-1,-1,-1):
for j in range(i,len(s)):
if s[i]==s[j]:
if j-i<=1:
res +=1
dp[i][j]=True
elif dp[i+1][j-1]:
res +=1
dp[i][j]=True
return res
5. 最长回文子串
题目链接
一、动态规划
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
dp=[[False]*len(s) for _ in range(len(s))]
maxlength=0
left=0
right=0
for i in range(len(s)-1,-1,-1):
for j in range(i,len(s)):
if s[i]==s[j]:
if j-i<=1:
dp[i][j]=True
elif dp[i+1][j-1]:
dp[i][j]=True
if dp[i][j] and j-i+1>maxlength:
maxlength=j-i+1
left=i
right=j
return s[left:right+1]
516.最长回文子序列
题目链接
一、法一
class Solution(object):
def longestPalindromeSubseq(self, s):
"""
:type s: str
:rtype: int
"""
dp=[[0]*len(s) for _ in range(len(s))]
for i in range(len(s)):
dp[i][i]=1
for i in range(len(s)-1,-1,-1):
for j in range(i+1,len(s)):
if s[i]==s[j]:
dp[i][j]=dp[i+1][j-1]+2
else:
dp[i][j]=max(dp[i+1][j],dp[i][j-1])
return dp[0][-1]