647. 回文子串:
class Solution:
def countSubstrings(self, s: str) -> int:
dp = [[False] * len(s) for _ in range(len(s))]
result = 0
for i in range(len(s)-1, -1, -1): #注意遍历顺序
for j in range(i, len(s)):
if s[i] == s[j] and (j - i <= 1 or dp[i+1][j-1]):
result += 1
dp[i][j] = True
return result
516.最长回文子序列
class Solution:
def longestPalindromeSubseq(self, s: str) -> 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]
本文介绍了两种使用动态规划解决字符串问题的算法:一是找到字符串中所有的回文子串,二是求最长的回文子序列。在`countSubstrings`方法中,通过遍历字符串并使用二维动态规划数组`dp`来记录子串是否为回文,从而计算回文子串的数量。而在`longestPalindromeSubseq`方法中,同样利用动态规划数组,计算最长回文子序列的长度。这两个方法都展示了动态规划在处理字符串回文问题上的高效性。
894

被折叠的 条评论
为什么被折叠?



