题目:

Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal.

Example 1:

Input: s1 = "sea", s2 = "eat"
Output: 231
Explanation: Deleting "s" from "sea" adds the ASCII value of "s" (115) to the sum.
Deleting "t" from "eat" adds 116 to the sum.
At the end, both strings are equal, and 115 + 116 = 231 is the minimum sum possible to achieve this.

Example 2:

Input: s1 = "delete", s2 = "leet"
Output: 403
Explanation: Deleting "dee" from "delete" to turn the string into "let",
adds 100[d]+101[e]+101[e] to the sum. Deleting "e" from "leet" adds 101[e] to the sum.
At the end, both strings are equal to "let", and the answer is 100+101+101+101 = 403.
If instead we turned both strings into "lee" or "eet", we would get answers of 433 or 417, which are higher.

Note:

  • 0 < s1.length, s2.length <= 1000.
  • All elements of each string will have an ASCII value in [97, 122].

思路:

这是一道典型的动态规划题目,建立二维数组dp,其中dp[i][j]表示字符串s1的前i个字符和字符串s2的前j个字符要变相等所需要删除的字符的最小ASCII码。

首先对dp进行初始化,当一个字符串为空时,另一个字符串需要删除全部的字符串才能保证两个字符串相等。

for (int i = ; i <= (signed) s1.length(); i++) {
dp[i][] = dp[i - ][] + (int) s1[i - ];
}
for (int i = ; i <= (signed) s2.length(); i++)
dp[][i] = dp[][i - ] + (int) s2[i - ];

对于dp[i][j],一共有3三种方法到达dp[i][j]

当s1[i-1] == s2[j-1]时,不需要删除s1[i-1]和s2[j-1]就可以保证两个字符串相等,此时dp[i][j] = dp[i-1][j-1]

当s1[i-1] != s2[j-1]时,dp[i][j]可以等于dp[i-1][j]+s1[i-1],也可以等于dp[i][j-1]+s2[j-1]。

  dp[i-1][j]+s1[i-1]表示由于从dp[i-1][j]到dp[i][j],增加了字符s1[i-1],s2的字符没有变。想要相同,就必须删除s1[i-1]。

  dp[i][j-1]+s2[j-1]表示由于从dp[i][j-1]到dp[i][j],增加了字符s2[j-1],s1的字符没有变。想要相同,就必须删除s2[j-1]。

代码:

 #include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
int minimumDeleteSum(string s1, string s2) {
//dp[i][j]代表s1的前i个字符与s2的前j个字符相等所需要删除的最小ascii码
int dp[s1.length() + ][s2.length() + ] = { };
//初始化
for (int i = ; i <= (signed) s1.length(); i++) {
dp[i][] = dp[i - ][] + (int) s1[i - ];
}
for (int i = ; i <= (signed) s2.length(); i++)
dp[][i] = dp[][i - ] + (int) s2[i - ]; for (int i = ; i <= (signed) s1.length(); i++) {
for (int j = ; j <= (signed) s2.length(); j++) {
//字符相等,不需要删除元素
if (s1[i - ] == s2[j - ])
dp[i][j] = dp[i - ][j - ];
else {
dp[i][j] = min(dp[i - ][j] + (int) s1[i - ],
dp[i][j - ] + (int) s2[j - ]);
}
cout << dp[i][j] << " ";
}
}
cout << endl;
return dp[s1.length()][s2.length()];
}
};

举例:

以sea和eat为例。

当i=1,j=1时,dp[1][1] = min(dp[0][1]+s1[0],dp[1][0]+s2[0])  = e+s = 216

  dp[0][1]+s1[0]表示eat已经删除了e,sea需要删除s。

  dp[1][0]+s2[0]表示sea已经删除了s,eat需要删除e。

当i=1,j=2时,dp[1][2] = min(dp[0][2]+s2[0],dp[1][1]+s2[1]) = min(ea+s,se+a) = a+e+s = 313

  dp[0][2]+s2[0]表示eat已经删除了ea,sea需要删除s。

  dp[1][1]+s2[1]表示sea已经删除了s,eat已经删除了e,需要删除a。

当i=1,j=3时,dp[1][3] = min(dp[0][3]+s1[0],dp[1][2]+s2[2]) = min(eat+s,s+ea+t) = a+e+s+t = 429

  dp[0][3]+s1[0]表示eat已经删了eat,sea需要删除s。

  dp[1][2]+s2[2]表示sea已经删除了s,eat已经删除了ea,需要删除t。

当i=2,j=1时,dp[2][1] = dp[1][0] = 115

  由于s1[1]与s2[0]相同,只需要删除sea中的s。

当i = 2,j = 2时,dp[2][2] = min(dp[1][2]+s1[1],dp[2][1]+s2[1]) = a+s = 212

  dp[1][2]+s1[1]表示sea已经删除了s,eat已经删除了ea,sea还需要删除e。

  dp[2][1]+s2[1]表示sea已经删除了s,eat还需要删除a。

当i=2,j=3时,dp[2][3] = min(dp[1][3]+s1[1],dp[2][2]+s2[2]) = a+s+t = 328

  dp[1][3]+s1[1]表示sea已经删除了s,eat已经删除了eat,sea还需要删除e。

  dp[2][2]+s2[2]表示sea已经删除了s,eat已经删除了a,eat还需要删除t。

当i=3,j=1时,dp[3][1] = min(dp[2][1]+s1[2],dp[3][0]+s2[0]) = s+a = 212

  dp[2][1]+s1[2]表示sea已经删除了s,sea还需要删除a。

  dp[3][0]+s2[0]表示sea已经删除了sea,eat还需要删除a。

当i=3,j=2时,dp[3][2] = dp[2][1] = 115

当i=3,j=3时,dp[3][3] = min(dp[2][3]+s1[2],dp[3][2]+s2[2]) = s + t = 231

  dp[3][2]+s2[2]表示sea已经删除了s,eat还需要删除t。

712. Minimum ASCII Delete Sum for Two Strings的更多相关文章

  1. LN : leetcode 712 Minimum ASCII Delete Sum for Two Strings

    lc 712 Minimum ASCII Delete Sum for Two Strings 712 Minimum ASCII Delete Sum for Two Strings Given t ...

  2. LC 712. Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  3. [LeetCode] 712. Minimum ASCII Delete Sum for Two Strings 两个字符串的最小ASCII删除和

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  4. 【LeetCode】712. Minimum ASCII Delete Sum for Two Strings 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. 【leetcode】712. Minimum ASCII Delete Sum for Two Strings

    题目如下: 解题思路:本题和[leetcode]583. Delete Operation for Two Strings 类似,区别在于word1[i] != word2[j]的时候,是删除word ...

  6. LeetCode 712. Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  7. Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings)

    Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings) 给定两个字符串s1, s2,找到 ...

  8. [LeetCode] Minimum ASCII Delete Sum for Two Strings 两个字符串的最小ASCII删除和

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  9. [Swift]LeetCode712. 两个字符串的最小ASCII删除和 | Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

随机推荐

  1. 【JavaScript】for循环小练习

    1.输出1-100的和 var sum = 0; for(var i=1;i<=100;i++){ sum = sum + i; } document.write(sum); 2.输出1-100 ...

  2. 关于 mysql2 -v '0.3.21'(CentOS7.3)

    个人由于没有安装mysql而是装的MariaDB,所以网上说安装mysql,故没有采用,经查阅资料后,详细情况如下: Gem时报错: [root@localhost ~]# gem install m ...

  3. 2018-2019-2 20165305《网络攻防技术》Exp5 MSF基础应用

    1. 实践内容 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如ms08_067; (1分) 1.2 一个针对浏览器的攻击, ...

  4. CAN双机通讯调试小结(SJA1000与MCP2515通讯)

    2011-12-07 21:36:02. 效果图: 1,51的SJA1000自收自发测试完成,见上一篇小结. 2,SJA1000自测完成后,再自测MCP2515就非常容易.主要是设置工作模式为回环模式 ...

  5. Oarcle 之连接查询

            连接查询:连接查询是关系数据库中最主要的查询,主要包括内连接.外连接和交叉连接等.通过连接运算符可以实现多个表查询.连接是关系数据库模型的主要特点,也是它区别于其它类型数据库管理系统的 ...

  6. 使用xshell从远程服务器下载文件到本地

    XSHELL工具上传文件到Linux以及下载文件到本地(Windows) Xshell很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz.首先你的L ...

  7. docker tmpfs 的测试结果

    创建 2G 内存的 Container 使用tmpfs挂载到 /tmp docker run --rm -it --memory 2g --mount type=tmpfs,destination=/ ...

  8. 01: 腾讯云API-云服务器

    1.1 云服务器 1.腾讯云SDK使用举例 网址:https://cloud.tencent.com/document/sdk/Python #! /usr/bin/env python # -*- ...

  9. HBuilder --- MUI , HTML5

    一.创建简单app应用 ① ② ③连接手机 ④ 二.MUI  各组件的运用 http://dev.dcloud.net.cn/mui/snippet/ 三. HTML5plus 参考文档:  http ...

  10. ajaxToolkit 异步加载报 错误500的解决方法

    设置IIS程序池的托管模式为经典