力扣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];
    }
};
相关推荐
醇醛酸醚酮酯几秒前
std::promise和std::future的使用示例——单线程多链接、多线程单链接
网络·c++·算法
2301_1472583691 分钟前
7月1日作业
java·前端·算法
Ting-yu5 分钟前
Java中Stream流的使用
java·开发语言·windows
一只猿Hou22 分钟前
java分页插件| MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践
java·mybatis
程序员弘羽27 分钟前
C++ 第四阶段 内存管理 - 第二节:避免内存泄漏的技巧
java·jvm·c++
旷世奇才李先生31 分钟前
Tomcat 安装使用教程
java·tomcat
爱思德学术40 分钟前
中国计算机学会(CCF)推荐学术会议-B(交叉/综合/新兴):BIBM 2025
算法
勤奋的知更鸟1 小时前
Java 编程之策略模式详解
java·设计模式·策略模式
qq_4924484461 小时前
Java 访问HTTP,信任所有证书,解决SSL报错问题
java·http·ssl
爱上语文1 小时前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端