[LeetCode] 516. Longest Palindromic Subsequence
Given a string s
, find the longest palindromic subsequence's length in s
.
A subsequence is a sequence that can be derived from another sequence by deleting some or no elements without changing the order of the remaining elements.
Example 1:
Input: s = "bbbab" Output: 4 Explanation: One possible longest palindromic subsequence is "bbbb".
Example 2:
Input: s = "cbbd" Output: 2 Explanation: One possible longest palindromic subsequence is "bb".
Constraints:
1 <= s.length <= 1000
s
consists only of lowercase English letters.
最长回文子序列。
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-palindromic-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这道题属于回文那一类的题目,做法还是动态规划,思路跟第5题和第647题很像,可以放在一起做。但是注意这道题跟另外两道题的区别,这道题是求子序列,而另外两道题是求子串。
具体做法还是创建一个二维的 boolean DP 数组记录结果。这道题 DP 的定义是子区间 [left, right] 内最长的子序列的长度。初始化把所有的 dp[left][left] == 1,因为所有字母都可以自己组成一个长度为 1 的回文子序列。
接着开始扫描,还是类似第五题的方式,left 指针从右往左扫描,right 指针从左往右扫描,这样不会遗漏掉任何中间结果。其他解释参见代码注释。DP 题如果理解思路和推导过程,代码一般都非常简单。
时间O(n^2)
空间O(n^2)
Java实现
1 class Solution { 2 public int longestPalindromeSubseq(String s) { 3 int[][] dp = new int[s.length()][s.length()]; 4 for (int left = s.length() - 1; left >= 0; left--) { 5 // 所有的字母可以自成一个回文串,长度是1 6 dp[left][left] = 1; 7 for (int right = left + 1; right < s.length(); right++) { 8 // 如果两个字母一样,DP值+2 9 if (s.charAt(left) == s.charAt(right)) { 10 dp[left][right] = dp[left + 1][right - 1] + 2; 11 } 12 // 否则尝试看看是否可能加在其中一侧 13 else { 14 dp[left][right] = Math.max(dp[left + 1][right], dp[left][right - 1]); 15 } 16 } 17 } 18 return dp[0][s.length() - 1]; 19 } 20 }
相关题目
5. Longest Palindromic Substring