力扣--动态规划516.最长回文子序列

思路分析:

  1. 创建一个二维动态规划表dp,其中dp[i][j]表示在子串s[i...j]中的最长回文子序列的长度。
  2. 初始化基本情况:对角线上的元素dp[i][i]都为1,因为单个字符本身就是长度为1的回文子序列。
  3. 从字符串末尾向前遍历,填充动态规划表。对于每一对(i, j),如果s[i]等于s[j],则当前子串的最长回文子序列长度为dp[i + 1][j - 1] + 2,否则取dp[i + 1][j]dp[i][j - 1]中的较大值。
  4. 最终结果存储在dp[0][s.size() - 1]中,表示整个字符串s的最长回文子序列的长度。
cpp 复制代码
class Solution {
public:
    // 计算最长回文子序列的长度
    int longestPalindromeSubseq(string s) {
        // 创建二维动态规划表,dp[i][j]表示子串s[i...j]的最长回文子序列长度
        vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));

        // 初始化基本情况:单个字符本身就是长度为1的回文子序列
        for (int i = 0; i < s.size(); i++) {
            dp[i][i] = 1;
        }

        // 自底向上填充动态规划表
        // 从字符串末尾向前遍历
        for (int i = s.size() - 1; i >= 0; i--) {
            for (int j = i + 1; j < s.size(); j++) {
                // 如果s[i]等于s[j],当前子串的最长回文子序列长度为dp[i + 1][j - 1] + 2
                if (s[i] == s[j]) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                } else {
                    // 否则,取dp[i + 1][j]和dp[i][j - 1]中的较大值
                    dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
                }
            }
        }

        // 最终结果存储在dp[0][s.size() - 1]中,表示整个字符串s的最长回文子序列长度
        return dp[0][s.size() - 1];
    }
};
相关推荐
艾莉丝努力练剑9 分钟前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
闪电麦坤951 小时前
数据结构:迭代方法(Iteration)实现树的遍历
数据结构·二叉树·
C++、Java和Python的菜鸟2 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀2 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散1122 小时前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧2 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
阿巴~阿巴~2 小时前
深入解析C++ STL链表(List)模拟实现
开发语言·c++·链表·stl·list
..过云雨3 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习
myzzb3 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa
拂晓银砾3 小时前
Java数据结构-栈
java·数据结构