LeetCode——516. 最长回文子序列

题目描述:

给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。

提示:

  • 1 <= s.length <= 1000
  • s 只包含小写英文字母

示例 1:
输入:
“bbbab”
输出:
4
一个可能的最长回文子序列为 “bbbb”。

示例 2:
输入:
“cbbd”
输出:
2
一个可能的最长回文子序列为 “bb”。

解题思路:

  • 状态 f[i][j] 表示 s 的第 i 个字符到第 j 个字符组成的子串中,最长的回文序列长度是多少
  • 转移方程
    如果 s 的第 i 个字符和第 j 个字符相同的话 f[i][j] = f[i + 1][j - 1] + 2
    如果 s 的第 i 个字符和第 j 个字符不同的话 f[i][j] = max(f[i + 1][j], f[i][j - 1])
  • 然后注意遍历顺序,i 从最后一个字符开始往前遍历,j 从 i + 1 开始往后遍历,这样可以保证每个子问题都已经算好了
  • 初始化 f[i][i] = 1 单个字符的最长回文序列是 1
  • 结果 f[0][n - 1]

JAVA代码如下:

class Solution {
    
    
    public int longestPalindromeSubseq(String s) {
    
    
        int n = s.length();
        char[] ch = s.toCharArray();
        int[][] dp = new int[n][n];
        for (int i = 0; i < n; i++) {
    
    
            dp[i][i] = 1;
        }
        for (int i = n - 2; i >= 0; i--) {
    
    
            for (int j = i + 1; j < n; j++) {
    
    
                if (ch[i] == ch[j]) {
    
    
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                } else {
    
    
                    dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[0][n-1];
    }
}

执行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/FYPPPP/article/details/113432891
今日推荐