题目描述

给定两个字符串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。

所有字符串中的字符ASCII值在[97, 122]之间。

算法

这是动态规划的一道题目,凡是这类题目都需要拿起笔来推演过程,在过程中就能发现状态转移方程。下面以s1 = "delete", s2 = "leet"为例给出更新的表格,dp[i][j]代表s1(0,j)与s2(0,1)两个字符串要想相同需要删除的字符

s2\s1 d e l e t e
l d+l d+l+e d+e d+e+e d+e+e+t d+e+e+t+e
e d+l+e d+l d+e+e d+e d+e+t d+e+e+t
e d+l+e+e d+l+e d+e+e+e d+e+e d+e+e+t d+e+t
t d+l+e+e+t d+l+e+t d+e+e+e+t d+e+e+t d+e+e d+e+e+e

代码

#include <iostream>
#include <map>
#include <algorithm>
#include <numeric>
using namespace std; class Solution{
public:
int minimumDeleteSum(string s1, string s2) {
if (s1 == "" && s2 == "")
return 0;
else if (s1 == "")
return accumulate(s2.begin(), s2.end(), 0);
else if (s2 == "")
return accumulate(s1.begin(), s1.end(), 0);
else
{
// parameters
int col = s1.size();
int row = s2.size();
int dp[row][col]; // dp[i][j]-两个字符串s1(0, j)与s2(0, i)的最小ASCII删除和 // initialize
bool total_switch = true;
if (s1[0] == s2[0])
{
dp[0][0] = 0;
total_switch = false;
}
else
dp[0][0] = s1[0] + s2[0]; bool first_time = true;
if (total_switch == false)
first_time = false;
for (int i = 1; i < col; i++)
{
if (s1[i] == s2[0] && first_time == true)
{
dp[0][i] = dp[0][i-1] - s2[0];
first_time = false;
}
else
dp[0][i] = dp[0][i-1] + s1[i];
} first_time = true;
if (total_switch == false)
first_time = false;
for (int i = 1; i < row; i++)
{
if (s1[0] == s2[i] && first_time == true)
{
dp[i][0] = dp[i-1][0] - s1[0];
first_time = false;
}
else
dp[i][0] = dp[i-1][0] + s2[i];
} // update dp[i][j]
for (int i = 1; i < row; i++)
{
for (int j = 1; j < col; j++)
{
// 更新条件
if (s1[j] == s2[i])
dp[i][j] = dp[i-1][j-1];
else
dp[i][j] = min((dp[i-1][j] + s2[i]), dp[i][j-1] + s1[j]);
}
}
return dp[row-1][col-1];
}
}
}; int main()
{
Solution s;
string s1 = "caabcccaccccca", s2 = "cacbaaac";
cout << "最小和是:\n" << s.minimumDeleteSum(s1, s2) << endl;
return 0;
}

【leet-code】712. 两个字符串的最小ASCII删除和的更多相关文章

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

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

  2. Java实现 LeetCode 712 两个字符串的最小ASCII删除和(最长公共子串&&ASCII值最小)

    712. 两个字符串的最小ASCII删除和 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 ...

  3. Leetcode 712. 两个字符串的最小ASCII删除和

    题目描述: https://leetcode-cn.com/problems/minimum-ascii-delete-sum-for-two-strings/ 解题思路: 也是典型的dp问题.利用二 ...

  4. [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. ...

  5. [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. ...

  6. Q712 两个字符串的最小ASCII删除和

    给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" 输出: ...

  7. [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. ...

  8. 算法61---两个字符串的最小ASCII删除和【动态规划】

    一.题目: 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" ...

  9. Leet Code 2.两数相加

    2.两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...

随机推荐

  1. FTP服务与配置

    FTP简介 网络文件共享服务主流的主要有三种,分别是ftp.nfs.samba. FTP是File Transfer Protocol(文件传输协议)的简称,用于internet上的控制文件的双向传输 ...

  2. 学习Tensorflow的LSTM的RNN例子

    学习Tensorflow的LSTM的RNN例子 基于TensorFlow一次简单的RNN实现 极客学院-递归神经网络 如何使用TensorFlow构建.训练和改进循环神经网络

  3. 阿里巴巴Java开发规约插件安装使用指南

    编码规范插件安装使用指南 阿里技术公众号于今年的2月9日首次公布<阿里巴巴Java开发规约>,瞬间引起全民代码规范的热潮,后又发布了PDF的终极版,大家踊跃留言,期待配套的静态扫描工具开放 ...

  4. javascript day 02

    js-day02 1.数据类型转换2.函数3.分支结构*******************************1.数据类型转换 数据类型:number,string,boolean,null,u ...

  5. 使用itext生成pdf的,各种布局

    代码如下,jar包为itext.jar,itextAsia.jar,最好都是最新的 :2张图片也在最后贴出,把图片放到D盘可以直接生成制定格式的pdf. 最后生成的pdf如下: 代码如下: packa ...

  6. QQ网页弹窗

    QQ网页弹窗 1.网址:http://shang.qq.com/v3/index.html 2.选推广工具,提示语随便写 3.建一个html 网页,并把代码拷进去. 4.双击网页,就可以打开了.(用E ...

  7. python多版本管理包pyenv

    前言: CentOS7  默认版本 python2.7.5 ,但是目前项目开发都是在python3的环境下,而单独编译安装python3时会出现各种异常!!! 系统默认python2.7又不能删除,否 ...

  8. Liferay7 BPM门户开发之24: Liferay7应用程序安全

    整理中...... Resources, Roles, and PermissionsPortal Access Control List (PACL) Custom SSO Providers Au ...

  9. 在浏览器中输入www.baidu.com后执行的全部过程

    1.客户端浏览器通过DNS解析到www.baidu.com 的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径.客户端浏览器发起一个HTTP会话到220.181.27.48 ...

  10. 使用Masonry对UIScrollView自动布局

    之前使用Masonry对UIScrollView进行过约束,当时是遇到了问题的,怎么约束都不对,因为赶进度直接改用frame了也没有对问题深究.就这样过了很久.........,直到前一段换工作的时候 ...