📅  最后修改于: 2023-12-03 14:50:48.585000             🧑  作者: Mango
给定一个字符串S,找到S中最长的回文子序列的长度。字符串S可能包含大小写字母、数字和符号字符。
def longest_palindromic_subsequence(s: str) -> int:
pass
assert longest_palindromic_subsequence("bbbab") == 4
assert longest_palindromic_subsequence("cbbd") == 2
最长回文子序列是一种经典的动态规划问题。具体来说,我们可以使用一个二维数组dp
来记录从i
到j
的子序列中,最长回文子序列的长度。那么,当i==j
时,最长回文子序列的长度为1;当i<j
时,如果s[i]==s[j]
,那么dp[i][j]=dp[i+1][j-1]+2
,否则,dp[i][j]=max(dp[i+1][j], dp[i][j-1])
。最后,返回dp[0][-1]
即可。
def longest_palindromic_subsequence(s: str) -> int:
n = len(s)
# 初始化dp数组
dp = [[0] * n for _ in range(n)]
for i in range(n):
dp[i][i] = 1 # 初始化对角线的值为1
# 填充dp数组
for gap in range(1, n):
for i in range(n-gap):
j = i + gap
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]