力扣3472. 至多 K 次操作后的最长回文子序列

力扣3472. 至多 K 次操作后的最长回文子序列

题目

题目解析及思路

题目要求在最多k次操作下返回s的最长回文子序列的长度

就是在最长回文子序列模板下多了一个k次操作

开三维f[K][n-1][n-1]vector<vector<vector<int>>> f(K+1,vector<vector<int>>(n,vector<int>(n)));

f[k][i][j]表示在最多k次操作下,s[i...j]的最长回文子序列的长度

代码

cpp 复制代码
class Solution {
public:
    int longestPalindromicSubsequence(string s, int K) {
        int n = s.size();
        int cnt = 0;
        //优化,如果操作次数够多能将整个字符串弄成回文,直接return
        for(int i=0;i<n/2;i++){
            int d = abs(s[i] - s[n-1-i]);
            cnt += min(d,26-d);
        }
        if(cnt <= K){
            return n;
        }

        vector<vector<vector<int>>> f(K+1,vector<vector<int>>(n,vector<int>(n)));
        //外层枚举啥都行
        for(int k=0;k<=K;k++){
            for(int i=n-1;i>=0;i--){
                f[k][i][i] = 1;
                for(int j=i+1;j<n;j++){
                    //s[i] != s[j]
                    f[k][i][j] = max(f[k][i+1][j],f[k][i][j-1]);
                    //s[i] == s[]或者修改成相同
                    int d = abs(s[i] - s[j]);
                    int op = min(d,26-d);
                    if(op <= k){
                        f[k][i][j] = max(f[k][i][j],f[k-op][i+1][j-1] + 2);
                    }
                }
            }
        }
        return f[K][0][n-1];
    }
};
相关推荐
Yzzz-F8 分钟前
Problem - 2194E - Codeforces
算法
像污秽一样8 分钟前
算法设计与分析-习题12.2
算法·迭代改进·分支界限
x_xbx15 分钟前
LeetCode:83. 删除排序链表中的重复元素
算法·leetcode·链表
西门吹-禅22 分钟前
【sap fiori cds up error】
java·服务器·sap cap cds
_小草鱼_35 分钟前
【搜索与图论】DFS算法(深度优先搜索)
算法·深度优先·图论·回溯·递归
敲代码的嘎仔1 小时前
Java后端面试——SSM框架面试题
java·面试·职场和发展·mybatis·ssm·springboot·八股
大傻^1 小时前
Spring AI Alibaba RAG实战:基于向量存储的检索增强生成
java·人工智能·spring
I_LPL1 小时前
hot100 栈专题
算法·
大傻^1 小时前
Spring AI Alibaba 快速入门:基于通义千问的AI应用开发环境搭建
java·人工智能·后端·spring·springai·springaialibaba
伯恩bourne1 小时前
Google Guava:Java 核心工具库的卓越之选
java·开发语言·guava