【Leetcode动态规划--回文】647.回文子串的数量(连续) 5.最长回文子串(连续) 516.最长回文子序列(不连续)

本文详细介绍了LeetCode中涉及回文子串和子序列的动态规划解题思路。对于连续的回文子串(如647题),dp定义为结尾,状态来源单一,寻找过程中最大值或记录数量。而对于不连续的回文子序列(如516题),dp定义为范围,状态来源有两个,最终结果为dp数组的最终值。文章通过递推逻辑和遍历顺序阐述了解题方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



总结

这两个题和之前的公共子序列一样,都分连续不连续,

连续的->dp定义为结尾->状态来源只有一个->结果是过程中求最大或过程中记录

不连续->dp定义为范围->状态来源有两个->结果永远是dp[0][len]等这种dp数组的最终值


Leetcode647

1.问题描述

在这里插入图片描述

2.解决方案

a.dp的定义就是回文的定义dp[i][j]:[i,j]闭区间是否为回文子串

b.递推吧也不用多说,按照定义来就好

c.遍历顺序要以递推逻辑来定,由下图可见

在这里插入图片描述

d.由定义j>=i,所以遍历只遍一半就好,j从i开始

for(int i=len-1;i>=0;i--){
   
	for(int j=i;j<=len-1;j++){
   


class Solution {
   
public:
    int countSubstrings(string s) {
   
        //1.
        int len=s.size();

        //2.
        vector<vector<bool> > dp(len,vector<bool>(len,false));

        //3.
        int ans=0;
        for(int i=len-1;i>=0;i--){
   
            for(int j=i;j<=len-1;j++){
   
                if(s[i]==s[j]){
   
                    if(j-i<=1) {
   dp[i][j]=true; ans++;}
                    if(j-i>1&&dp[i+1][j-1]==true) {
   dp[i][j]=true; ans++;}
                }
            }
        }

        //4.
        return ans;
    
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值