9.15【A】

2472

定义DPi为以i结尾的回文字符串,所能组成的最大数量的回文字符串数量

有关键洞察为,回文字符串长度最多为k与k+1,对于k+2及后面的所有情况,都可以由贪心归纳为k与k+1

对于1到n的所有下标,dpi可由i-k+1与i-k两个下标得到,即分别对应以i为结尾的字符串长度为k与k+1的情况

首先判断以i为结尾的子串,在k与k+1的情况下是否能构成回文字符串

若都不能,则dpi取0

否则,取max

最终取1到n之间的dpMax

复制代码
class Solution {
public:
    int maxPalindromes(string s, int k) {
        int n=s.size();
        vector<int>dp(n,0);
        bool flag=true;
        for(int i=0;i<(k+1)/2;i++){
            if(s[i]!=s[k-i-1]){
                flag=false;
                break;
            }
        }
        if(flag){dp[k-1]=1;}
        flag=true;
        for(int i=0;i<(k+1)/2;i++){
            if(s[i]!=s[k-i]){
                flag=false;
                break;
            }
        }
        if(flag){dp[k]=1;}
        int res=max(dp[k-1],dp[k]);
        for(int i=1;i<=k;i++){dp[i]=max(dp[i],dp[i-1]);}
        for(int i=k+1;i<n;i++){
            bool flag0=true,flag1=true;
            for(int j=0;j<k/2;j++){
                if(s[i-k+1+j]!=s[i-j]){
                    flag0=false;
                    break;
                }
            }
            for(int j=0;j<(k+1)/2;j++){
                if(s[i-k+j]!=s[i-j]){
                    flag1=false;
                    break;
                }
            }
            dp[i]=max(dp[i],dp[i-1]);
            if(flag0){dp[i]=max(dp[i-k]+1,dp[i]);}
            if(flag1){dp[i]=max(dp[i-k-1]+1,dp[i]);}
            // for(int j=i-k+1;j<=(i+1)/2;j++){
            //     if(s[j]!=)
            // }
            res=max(res,dp[i]);
        }
        return res;
    }
};

正解

相关推荐
GoAI19 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi20 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M1 天前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen1 天前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷1 天前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方1 天前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん1 天前
【C++】哈希表
c++·算法·散列表
地平线开发者1 天前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
武子康1 天前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法