516. 最长回文子序列¶
力扣链接(中等):https://leetcode.cn/problems/longest-palindromic-subsequence
给你一个字符串 s
,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
示例 2:
提示:
1 <= s.length <= 1000
s
仅由小写英文字母组成
个人题解¶
本题和 647. 回文子串 不同,虽然都是求回文串,但一个是子串,一个是子序列,二者是完全不同的,所以递推公式也有所区别。
不难给出 dp
数组定义:dp[i][j]
代表区间为 [i, j]
的子串中最长回文子序列的长度。
大体思路还是类似,都是判断首尾是否相等,如果相等,则在首尾之间的区间状态 dp[i + 1][j - 1]
的基础上 +2
,因为首尾各占一个长度;如果首尾不相等,代表首尾这两个元素无法组合为回文串,所以需要抛弃掉左边界或者右边界,即 dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])
,这里为什么没有取 dp[i - 1][j - 1]
,因为一定满足 dp[i + 1][j], dp[i][j - 1] >= dp[i - 1][j - 1]
。
这里需要注意,如果首尾是同一个元素,即区间为 [i, i]
,则要特殊处理,代表这个子串长度为 1
,所以最长回文子序列也一定为 1
。
对于遍历顺序,分析方法和 647. 回文子串 一致,这里不再赘述。