今天的难点还是在于递推公式
647. Palindromic Substrings
这道题dp[i][j]代表从i到j为止,字串是不是回文。初始化全都是false。总数用一个变量记录。那么很显然如果s[i]等于s[j],才可能是回文,且是回文的要求是dp[i+1][j-1]也是true,或者本身i和j相差小于1.遍历顺序上是从下往上,从左往右,且只记录一半即可即j从i到len(s)遍历
class Solution:
def countSubstrings(self, s: str) -> int:
dp=[[False for _ in range(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
516. Longest Palindromic Subsequence
这道题和上一题的区别在于上一题是连续的串,这一题是非连续的。这道题dp[i][j]代表从i到j为止最长的字串的长度。初值来说除了dp[i][i]都是1其他的都是0,因为同一个字母的最长回文字串为1。然后就是递推公式,如果s[i]和s[j]相等,则dp[i][j]和dp[i+1][j-1]有关,等于他加上2.如果不等则取dp[i][j-1]和dp[i+1][j]的最大值即可。遍历顺序还是从下往上从左往右。最终返回的是右上角的值
class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
dp=[[0 for _ in range(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][j-1],dp[i+1][j])
return dp[0][-1]