【算法|动态规划No.27】leetcode516. 最长回文子序列

个人主页:兜里有颗棉花糖
欢迎 点赞 收藏✨ 留言✉ 加关注本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【LeetCode】
本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
希望我们一起努力、成长,共同进步。
在这里插入图片描述

点击直接跳转到该题目

目录

  • 1️⃣题目描述
  • 2️⃣题目解析
  • 3️⃣解题代码

1️⃣题目描述

给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

示例1:

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

示例2:

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

注意:

  • 1 <= s.length <= 1000
  • s 仅由小写英文字母组成

2️⃣题目解析

状态表示:

  • dp[i][j]:表示区间[i,j]中所子序列中,最长回文子序列的长度。

状态转移方程:

  • if(s[i] == s[j])时:dp[i][j] = dp[i + 1][j - 1] + 2
  • if(s[i] != s[j])时:dp[i][j] = max(dp[i + 1][j],dp[i][j - 1])

注意:s[i] == s[j]时包含了三种小的情况:i == ji + 1 == j其它情况

返回值:

  • dp[0][n - 1]

3️⃣解题代码

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n = s.size();
        vector<vector<int>> dp(n,vector<int>(n));
        for(int i = n - 1;i >= 0;i--)
        {
            dp[i][i] = 1;
            for(int j = i + 1;j < n;j++)
                if(s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1] + 2;
                else dp[i][j] = max(dp[i + 1][j],dp[i][j - 1]);
        }
        return dp[0][n - 1];
    }
};

最后就通过啦!!!

你可能感兴趣的:(手撕算法系列专栏,LeetCode,算法,动态规划,leetcode)