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.
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的更多相关文章
- 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 ...
- 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. ...
- [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. ...
- 【LeetCode】712. Minimum ASCII Delete Sum for Two Strings 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【leetcode】712. Minimum ASCII Delete Sum for Two Strings
题目如下: 解题思路:本题和[leetcode]583. Delete Operation for Two Strings 类似,区别在于word1[i] != word2[j]的时候,是删除word ...
- 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. ...
- Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings)
Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings) 给定两个字符串s1, s2,找到 ...
- [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. ...
- [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. ...
随机推荐
- Linux安全之SSH 密钥创建及密钥登录
1.首先进入Linux系统的用户目录下的.ssh目录下,root用户是/root/.ssh,普通用户是/home/您的用户名/.ssh,我们以root用户为例: cd .ssh #如果没有 自己创建 ...
- Godot-富文本
作用:添加链接(比如赞助网站,或者相关站点什么的) 效果如下: (引用Godot官网) Introduction RichTextLabel allows the display of complex ...
- ASP.NET MVC案例教程(四)
ASP.NET MVC案例教程(四) 前言 通过前几篇文章,我们已经能比较自如的使用ASP.NET MVC来呈现页面和数据了.但是,有一个大问题没有解决:如何处理表单数据.例如,我们将要实现的公告发布 ...
- ASP.NET页面之间传值的方式之Server.Transfer(个人整理)
Server.Transfer 这个方法相比以前介绍的方法稍微复杂一点,但在页面间值传递中却是特别有用的,使用该方法你可以在另一个页面以对象属性的方式来存取显露的值,当然了,使用这种方法,你需要额外写 ...
- java static关键字和代码块
static关键字 代码块 方法重写 1. 方法重写的特点: 2. 注意事项: static关键字 为什么需要学习static关键字? 针对某一个变量属于类而不属于某一个具体的对象的时候,我们可以考虑 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- JS动态添加行列
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Add-Delete Row.a ...
- mongo 修改器
[$inc] 作用:修改器$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作. Example: db.b.update({"uid" : "2 ...
- 对八皇后的补充以及自己解决2n皇后问题代码
有了上次的八皇后的基础.这次准备解决2n皇后的问题,: //问题描述// 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行./ ...
- Linux服务器 XAMPP后添加PHP和MYSQL环境变量
编辑/etc/profile文件 在文件末尾添加两行代码 vi /etc/profile CentOS: PATH=$PATH:/opt/lampp/bin export PATH Ubuntu: e ...