找回密码
 立即注册
查看: 2|回复: 0

动态规划巧解字符串压缩优化问题 - 力扣1531题深度解析

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 打卡月天数:4
  • 打卡总奖励:29
  • 最近打卡:2025-07-12 15:59:50

7

主题

2

回帖

2316

积分

VIP

积分
2316
发表于 昨天 16:03 | 显示全部楼层 |阅读模式
截图未命名.jpg
一、问题理解

行程长度编码(Run-Length Encoding)是一种简单有效的字符串压缩方法。题目要求我们在删除最多k个字符后,使压缩后的字符串长度最短。

二、解题思路
  • 情况1:删除当前字符,直接继承dp[i-1][j-1]
  • 情况2:保留当前字符,向前查找相同字符序列,计算保留这些字符的压缩成本

三、关键代码解析
  • 初始化:处理空字符串的情况
  • 双重循环:外层遍历字符串,内层遍历可能的删除次数
  • 压缩成本计算:根据相同字符数量计算编码长度

四、完整代码

  1. class Solution {
  2. public:
  3. int getLengthOfOptimalCompression(string s, int k) {
  4. int n = s.size();
  5. // dp[i][j]表示前i个字符删除j个字符后的最小压缩长度
  6. vector<vector<int>> dp(n+1, vector<int>(k+1, INT_MAX/2));

  7. // 初始化:前0个字符删除j个字符的压缩长度为0
  8. for(int j = 0; j <= k; ++j) {
  9. dp[0][j] = 0;
  10. }

  11. for(int i = 1; i <= n; ++i) {
  12. for(int j = 0; j <= min(i, k); ++j) {
  13. // 情况1:删除当前字符
  14. if(j > 0) {
  15. dp[i][j] = dp[i-1][j-1];
  16. }

  17. // 情况2:保留当前字符
  18. int same = 0, diff = 0;
  19. // 向前查找相同字符,考虑删除不同字符的情况
  20. for(int m = i; m >= 1; --m) {
  21. if(s[m-1] == s[i-1]) {
  22. same++;
  23. } else {
  24. diff++;
  25. if(diff > j) break;
  26. }

  27. // 更新dp值
  28. int cost = 0;
  29. if(same == 1) cost = 1;
  30. else if(same < 10) cost = 2;
  31. else if(same < 100) cost = 3;
  32. else cost = 4;

  33. dp[i][j] = min(dp[i][j], dp[m-1][j-diff] + cost);
  34. }
  35. }
  36. }

  37. return dp[n][k];
  38. }
  39. };
复制代码


五、学习建议
  • 先理解基础RLE算法
  • 练习简单DP问题
  • 逐步过渡到这类复杂DP问题

通过这道题,我们可以学习如何将复杂问题分解为子问题,并用动态规划高效解决。

来源:竞赛学习


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

SEO网站 ( 冀ICP备2025113422号-2 )|网站地图

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表