当前位置:首页 > 力扣 > LeetCode 1531题:动态规划解决字符串压缩

LeetCode 1531题:动态规划解决字符串压缩

4个月前 (08-18)

LeetCode 1531题:动态规划解决字符串压缩 动态规划 字符串 力扣题解 C++ 第1张

一、题目解读

LeetCode 1531题要求给定字符串s和整数k,返回通过删除最多k个字符后,能得到的最优压缩长度。

二、解题思路

动态规划解决该问题。核心思想是将问题分解为子问题:计算前i个字符在删除j个字符后的最短压缩长度。关键在于定义状态和状态转移方程,同时考虑字符删除与保留的权衡。

三、解题步骤

1. 状态定义:创建二维dp数组dp[i][j],表示前i个字符删除j个字符后的最小压缩长度。

2. 初始化:dp[0][j]=0(前0个字符的压缩长度为0)。

3. 状态转移

    情况1(删除当前字符):若j>0,可直接继承前i-1个字符删除j-1个字符的结果,即dp[i][j] = dp[i-1][j-1]。

    情况2(保留当前字符):向前查找连续相同字符段,统计相同字符数(same)与不同字符数(diff)。当diff超过j时停止(因删除数受限),计算压缩成本(根据字符计数长度:1个字符为1,2-9个为2,10-99为3,≥100为4)。通过dp[m-1][j-diff](前m-1个字符删除j-diff个字符)转移并更新最小压缩长度。

4. 最终结果:dp[n][k]即为整个字符串在删除k个字符后的最优压缩长度。

四、代码与注释

class Solution {
public:
    int getLengthOfOptimalCompression(string s, int k) {
        int n = s.size();
        // dp[i][j]:前i个字符删除j个字符后的最小压缩长度
        vector<vector<int>> dp(n+1, vector<int>(k+1, INT_MAX/2));
        
        // 初始化:前0个字符删除j个字符的压缩长度为0
        for(int j = 0; j <= k; ++j) {
            dp[0][j] = 0;
        }
        
        for(int i = 1; i <= n; ++i) {
            for(int j = 0; j <= min(i, k); ++j) {
                // 情况1:删除当前字符
                if(j > 0) {
                    dp[i][j] = dp[i-1][j-1];
                }
                
                // 情况2:保留当前字符
                int same = 0, diff = 0;
                // 向前查找相同字符,考虑删除不同字符的情况
                for(int m = i; m >= 1; --m) {
                    if(s[m-1] == s[i-1]) {
                        same++;
                    } else {
                        diff++;
                        if(diff > j) break;
                    }
                    
                    // 更新dp值
                    int cost = 0;
                    if(same == 1) cost = 1;
                    else if(same < 10) cost = 2;
                    else if(same < 100) cost = 3;
                    else cost = 4;
                    
                    dp[i][j] = min(dp[i][j], dp[m-1][j-diff] + cost);
                }
            }
        }
        
        return dp[n][k];
    }
};

五、总结

该解法通过动态规划巧妙地将问题转化为子问题求解,时间复杂度为O(n²k),空间复杂度为O(nk)。核心难点在于状态转移时平衡删除与保留字符的策略,并通过分段计数优化压缩成本计算。适用于需要高效处理字符串压缩与删除限制的场景,为同类问题提供了经典解题思路。



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

一、题目解读洛谷P4999题要求处理给定区间 [L, R] 内数字的拆分与求和问题。每个数字需拆分为其各位数字之和,并计算区间内所有数字之和的累加结果。题目需考虑大数情况,并采用取模运算(MOD=1e...

牛客25461题解析:花园喷泉距离优化算法(动态规划+后缀数组解法)

牛客25461题解析:花园喷泉距离优化算法(动态规划+后缀数组解法)

一、题目解读牛客25461题要求计算一个花园中n朵花到两个喷泉的最小距离平方和。用户需输入喷泉坐标(x1,y1)和(x2,y2),以及n朵花的坐标(x,y),通过合理分配每朵花到两个喷泉的距离,使总距...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。