0516. 最长回文子序列
题目地址(516. 最长回文子序列)
https://leetcode-cn.com/problems/longest-palindromic-subsequence/
题目描述
前置知识
动态规划
公司
阿里
腾讯
百度
字节
思路
这是一道最长回文的题目,要我们求出给定字符串的最大回文子序列。
解决这类问题的核心思想就是两个字“延伸”,具体来说
如果一个字符串是回文串,那么在它左右分别加上一个相同的字符,那么它一定还是一个回文串,因此
回文长度增加2
如果一个字符串不是回文串,或者在回文串左右分别加不同的字符,得到的一定不是回文串,因此
回文长度不变,我们取[i][j-1]和[i+1][j]的较大值
事实上,上面的分析已经建立了大问题和小问题之间的关联, 基于此,我们可以建立动态规划模型。
我们可以用 dp[i][j] 表示 s 中从 i 到 j(包括 i 和 j)的回文序列长度, 状态转移方程只是将上面的描述转化为代码即可:
base case 就是一个字符(轴对称点是本身)
关键点
”延伸“(extend)
代码
代码支持:JS,Python3
JS Code:
Python3 Code(记忆化递归):
Python3 Code(普通 dp)
复杂度分析
时间复杂度:枚举所有的状态需要 n^2 时间,状态转移需要常数的时间,因此总的时间复杂度为 $O(n^2)$
空间复杂度:我们使用二维 dp 存储所有状态,因此空间复杂度为 $O(n^2)$
相关题目
最后更新于