当前位置: 首页 > news >正文

每日一练:两个字符串的最小ASCLL删除和

712. 两个字符串的最小ASCII删除和 - 力扣(LeetCode)

题目要求:

给定两个字符串s1 和 s2,返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 

示例 1:

输入: s1 = "sea", s2 = "eat"
输出: 231
解释: 在 "sea" 中删除 "s" 并将 "s" 的值(115)加入总和。
在 "eat" 中删除 "t" 并将 116 加入总和。
结束时,两个字符串相等,115 + 116 = 231 就是符合条件的最小和。

示例 2:

输入: s1 = "delete", s2 = "leet"
输出: 403
解释: 在 "delete" 中删除 "dee" 字符串变成 "let",
将 100[d]+101[e]+101[e] 加入总和。在 "leet" 中删除 "e" 将 101[e] 加入总和。
结束时,两个字符串都等于 "let",结果即为 100+101+101+101 = 403 。
如果改为将两个字符串转换为 "lee" 或 "eet",我们会得到 433 或 417 的结果,比答案更大。

提示:

  • 0 <= s1.length, s2.length <= 1000
  • s1 和 s2 由小写英文字母组成

解法-1 动态规划 O(N^2):

        这个题需要逆向思维,求删除的最小和,那么我们可以求公共子序列的最大和;

        得到最大和后,用两个字符串-2*最大和得到的就是最小和。

class Solution {
public:int minimumDeleteSum(string s1, string s2) {int n = s1.size();int m = s2.size();int sum = 0;for(const char c:s1) sum+=c;for(const char c:s2) sum+=c;vector<vector<int>> dp(n+1,vector<int>(m+1));for(int i = 1;i <= n;i++){for(int j = 1;j <= m;j++){if(s1[i-1]==s2[j-1])dp[i][j]=dp[i-1][j-1]+s1[i-1];elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}sum-=2*dp[n][m];return sum;}
};  


http://www.mrgr.cn/news/48628.html

相关文章:

  • python根据端口查询出pid号是多少
  • GRS、GOTS、OCS、BCI、RDS的区别
  • ElasticSearch+Kibana 8.1.0安装部署
  • webm格式怎么转换成mp4?这几种方法可以轻松完成视频转换!
  • 基于Arduino的花瓶
  • mig IP核的学习
  • 前端开发攻略---前端ocr图片文字提取功能
  • WHAT - OpenAPI 规范和开放 API
  • 最全Python爬虫教程,学会你也是大师了!
  • 柯桥学日语日常口语入门教学当日本人说「すごいね」时,该怎么回?
  • 系统缺失mfc140.dll的修复方法,有效修复错误mfc140.dll详细步骤
  • sed删除每行末尾的空格或制表符
  • MES管理系统提升智能工厂四大核心能力
  • 数据结构 - 链表
  • 86 NAT 理论
  • 高德地图怎么定位自己的店铺?
  • 【排序算法】直接插入排序和希尔排序的全方位解读
  • matlab不小心删除怎么撤回
  • Redis主从复制机制详解
  • 【Python】 list dict数据合并汇总demo