力扣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];
    }
};
相关推荐
小小菜鸡ing43 分钟前
pymysql
java·服务器·数据库
getapi1 小时前
shareId 的产生与传递链路
java
bkspiderx1 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
我没想到原来他们都是一堆坏人2 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
沙二原住民2 小时前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
中华小当家呐2 小时前
算法之常见八大排序
数据结构·算法·排序算法
Jerry&Grj2 小时前
SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
java·微服务·性能优化·springboot·架构设计·埋点技术
没有bug.的程序员2 小时前
Redis Stream:轻量级消息队列深度解析
java·数据库·chrome·redis·消息队列
沐怡旸3 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试
用户8160791833333 小时前
告别“魔法”:包你解决 Gradle 的下载慢问题
java