代码随想录训练营Day 60|力扣647. 回文子串、516.最长回文子序列

1.回文子串

代码随想录

代码:

cpp 复制代码
class Solution {
public:
    int countSubstrings(string s) {
        vector<vector<bool>> dp(s.size(),vector(s.size(),false));
        int result = 0;
        for(int i = s.size() - 1; i >= 0; i--){ // 从下往上遍历
            for(int j = i; j < s.size(); j++){ // 从左往右遍历
                if(s[i] == s[j]){
                    if(j - i <= 1){
                        dp[i][j] = true;
                        result++;
                    }else if(dp[i + 1][j - 1] == true){
                        dp[i][j] = true;
                        result++;
                    }
                }
            }
        }
        return result;
    }
};

思路:

dp数组的含义:dp数组中下标为i到j(包括ij)的连续子串是否是回文子串

dp数组的递推公式:为了方面判断回文子串,并且用上我们之前的推导结果。去想一种可能------如果在一个回文子串两边添加相同的字符,那么新的子串也会是回文子串。因此如果 j - i <= 1的话,说明这个子串只涉及到i和j下标的元素,肯定是回文子串;否则,还要保证里面的子串也是回文子串,即dpi + 1j - 1 = true。

dp数组的初始化:只能全部初始化为false

dp数组的遍历顺序:在递推里,已经提到了,我们需要dp i + 1j - 1的值来推导新值,因此,只能从左到右,从下到上推导。

2.最长回文子序列

代码随想录

代码:

cpp 复制代码
class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));
        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++){ //因为dp公式里都是长度直接加2,就不要让i和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][s.size() - 1];
    }
};

思路:

dp数组的含义:dp数组中下标为i到j的子串中的最长回文子序列的长度为dpij

dp数组的递推公式:为了方面判断回文子串,并且用上我们之前的推导结果。去想一种可能------如果在一个回文子串两边添加相同的字符,那么新的子串也会是回文子串,即在dpi + 1 j - 1的基础上加2。如果添加的字符不同,就说明这两个字符在回文子串中是互斥的,也就是在dpi + 1j和dpi j - 1里找最大值。

dp数组的初始化:因为dp公式里都是长度直接加2,没有考虑让i和j相等的情况。所以这个需要我们初始化,i和j相等就是一个字符的子串,肯定是回文子串,长度都为1.

dp数组的遍历顺序:在递推里,已经提到了,我们需要dp i + 1j - 1的值来推导新值,因此,只能从左到右,从下到上推导。

相关推荐
fie8889几秒前
matlab打靶法求解两点边值优化问题
开发语言·算法·matlab
hai3152475436 分钟前
结构化编程:AI工业化编程的探索
数据结构·自然语言处理·硬件工程·动态规划·集成学习
酉鬼女又兒13 分钟前
零基础入门计算机网络:第一章概述全解(三种交换方式+八大性能指标+体系结构分层+十年考研真题精讲)
网络协议·计算机网络·考研·网络安全·职场和发展·计算机外设·求职招聘
不做无法实现的梦~16 分钟前
常见工程分析软件
stm32·嵌入式硬件·算法
王璐WL17 分钟前
【C++】经典易错题(2)
c++
我不是懒洋洋18 分钟前
手写一个异步日志库:从printf到高性能无锁日志
java·c语言·开发语言·c++·visual studio
2401_8685347821 分钟前
2026年5月系统分析
数据结构·python·tornado
hetao173383722 分钟前
2026-05-28~06-02 hetao1733837 的刷题记录
c++·算法
ZhengEnCi22 分钟前
O08-单写线程与单读线程冲突分析
算法
wunaiqiezixin37 分钟前
如何在C++中实现一个单例模式?
c++·单例模式