力扣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];
    }
};
相关推荐
用户1563068103512 小时前
Day01 | Java 基础(Java SE)
java
行者全栈架构师4 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师8 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_08 小时前
mac(m5)平台编译openjdk
java
JieE21217 小时前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack201 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树1 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
唐青枫1 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261351 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java