leetcode 刷题(十七)
动态规划
字符串
最长回文子序列
难度:中等
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb”示例 2:
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。
方法一
1
2
3
4
5
6
7
8
9
10
11
12
13class Solution:
def longestPalindromeSubseq(self, s: str) -> int:
n = len(s)
dp = [[0] * n for _ in range(n)]
for i in range(n-1,-1,-1):
dp[i][i] = 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][-1]解析
复杂度分析
时间复杂度:O(n^2),其中 n 是字符串 s 的长度。动态规划需要计算的状态数是 O(n^2)。
空间复杂度:O(n^2),其中 n 是字符串 s 的长度。需要创建二维数组 dp,空间是 O(n^2)。
https://blog.lizhen.store/2024/10/24/leetcode%E5%88%B7%E9%A2%98%EF%BC%88%E5%8D%81%E4%B8%83%EF%BC%89/
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 QXA!
评论