leetcode练习 最长回文子序列

文章目录

题目描述

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

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

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

题目思路

动态规划

  • 如果相等,就等于s[i + 1]到s[j - 1]这段子串的最长回文子序列 + 2(2就是当前正在比较的相等的2个字符的长度)

转移方程:

 dp[i][j] = dp[i + 1][j - 1] + 2;
  • 如果不等,就等于s[i + 1]到s[j]或者s[i]到s[j - 1]这两段子串的最长回文子序列中的最大的那一个

转移方程:

dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1])
class Solution {
    
    
    public int longestPalindromeSubseq(String s) {
    
    
        if (s == null || s.length() == 0)
            return 0;
        char[] chars = s.toCharArray();
        int n = s.length();
        int[][] dp = new int[n][n];
        for (int i = 0; i < n; i++) {
    
    
            dp[i][i] = 1;// dp[i][j]表示从i到j的子串中包含的最大回文子序列
        }
        for (int i = n - 1; i >= 0; i--) {
    
    
            for (int j = i + 1; j < n; j++) {
    
    
                if (chars[i] == chars[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/qq_45019698/article/details/108176205