动态规划递推核心思想
状态定义: dp[i][j]表示字符串s从索引i到j的最长回文子序列长度。
状态转移方程: 如果s[i] == s[j],则dp[i][j] = dp[i+1][j-1] + 2。 如果s[i] != s[j],则dp[i][j] = max(dp[i+1][j], dp[i][j-1])。
边界条件: 当i == j时,dp[i][i] = 1,因为单个字符本身是回文。
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param s string字符串 一个字符串由小写字母构成,长度小于5000
# @return int整型
#
class Solution:
def longestPalindromeSubSeq(self , s: str) -> int:
# write code here
n = len(s)
dp = [[0]*n for _ in range(n)]#递推公式表示为下标i到j最长的回文序列长度
for i in range(n-1,-1,-1):#左边界下标不断左移
dp[i][i] = 1#单个字符的回文子序列长度为1
for j in range(i+1,n):#右边界下标从当前左下标开始不断右移
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][n-1]#表示匆匆下标0到下标n的最长回文子串长度
力扣大神的多种方法解答,可以参考。



京公网安备 11010502036488号