题目:

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. Ajax请求二进制流并在页面展示

    后端代码: public void getIntegralQrcode(HttpServletResponse response, String token) throws BizException, ...

  2. “行业客户云原生最佳实践日” 亮相KubeCon上海

    2018年11月13日至15日,由CNCF主办的KubeCon + CloudNativeCon将首次登陆中国上海,这是全球范围内规模最大的Kubernetes和云原生技术盛会. 唯一聚焦客户实践的分 ...

  3. 201902<<百岁人生>>

    过年的那段时间,在家看到公司推荐的10本2019年必读书籍,里面有这本书,于是就开始了.... 第一次这么认真的看这类书籍,看完之后感触颇多,毕竟这个问题我从没思考过,很少站在这样的高度去看所有方方面 ...

  4. ubuntu安装postgresql以及pgadmin4当前最新(4.3)网页版

    pgAdmin4安装 1.安装安装包 sudo apt-get install build-essential libssl-dev libffi-dev libgmp3-dev virtualenv ...

  5. mysql user表root 用户误删除解决方法

    1:停止mysql服务2:mysql安装目录下找到my.ini;2:找到以下片段[mysqld]4:另起一行加入并保存skip-grant-tables5:启动mysql服务6:登录mysql(无用户 ...

  6. 在sql中case子句的两种形式

    case子句,在select后面可以进行逻辑判断. 两种形式:判断相等.判断不等 一.判断相等的语法: case 列名 when ...  then ... when ...  then ... el ...

  7. Oracle 11g 概述 chaper1

    关系模型 E-R 模型 范式 1.简述Oracle oracle 是1977  IBM 公司研发的一款强大的数据库软件. 2.关系型数据的基本理论 关系型数据库与数据库管理系统  1)数据库是因为有对 ...

  8. linux下wrk的安装

    wrk是linux下开源的性能测试工具,并且只能在linux下运行,下面介绍下安装教程(以ubantu18.04环境为例): 1.预先安装git,如:apt install git 2.从git上拉取 ...

  9. zigbee 安全通信加密链接密钥

    ---恢复内容开始--- #define KEY_TYPE_TC_MASTER  0        // Trust Center Master Key信任中心主密钥#define KEY_TYPE_ ...

  10. Python爬虫与一汽项目【三】爬取中国五矿集团采购平台

    网站地址:http://ec.mcc.com.cn/b2b/web/two/indexinfoAction.do?actionType=showMoreCgxx&xxposition=cgxx ...