题目描述

给定两个字符串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. 第六次spring会议

    昨天所做之事: 我对软件加上了保密功能. 今天所做内容: 我对软件加上了一键解密功能. private void 一键还原ToolStripMenuItem_Click(object sender, ...

  2. 使用fabric2打包部署文件

    一直以来都是复制粘贴或者拖动文件完成部署,实在是低效得很!学了学fabric,写个了脚本.如下: from fabric import Connection import shutil HOST = ...

  3. springMVC学习 十二 拦截器

    一 拦截器概述 拦截器技术比较像java web技术中的过滤器技术,都是发送 请求时被拦截器拦截,在控制器的前后添加额外功能.但是和Spring中的Aop技术是由区别的.AOP 在特定方法前后扩充(一 ...

  4. ABP框架系列之三十:(Javascript-API-Javascript-API)

    ASP.NET Boilerplate provides a set of objects and functions that are used to make javascript develop ...

  5. USART of STM32

    /*************************************************************************** * 文件名:USART.h * * 编写人:离 ...

  6. 761. Special Binary String

    Special binary strings are binary strings with the following two properties: The number of 0's is eq ...

  7. HTTP 协议支持的十种方法

    GET 获取资源,用来请求访问已被URI识别的资源. POST 传输实体主体. PUT 传输文件,(鉴于HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全性问题,因此一般We ...

  8. HTML+CSS实现页面豆腐块布局和图片居中

    <!DOCTYPE html> <html> <head lang="en"> <meta http-equiv="Conten ...

  9. Linux下MySQL的简单操作

    Linux下MySQL的简单操作 更改mysql数据库root的密码 首次进入数据库是不用密码的: [root@localhost ~]# /usr/local/mysql/bin/mysql -ur ...

  10. 机器学习框架之sklearn简介

    简介 今天为大家介绍的是scikit-learn.sklearn是一个Python第三方提供的非常强力的机器学习库,它包含了从数据预处理到训练模型的各个方面.在实战使用scikit-learn中可以极 ...