[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

516. Longest Palindromic Subsequence

647. Palindromic Substrings

LeetCode 题目总结

posted @ 2022-06-29 11:21  CNoodle  阅读(51)  评论(0编辑  收藏  举报