题目描述

给定两个字符串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. Jmeter利用CSV Data Set Config 和 _CSVRead函数实现参数化

    测试接口时,当请求参数不是固定的,每次请求对应的参数都是不同的,就需要对请求参数进行参数化.我们这里简单介绍一下5个用户与一个用户建立好友关系. 一.测试需求描述 1. 本次测试的接口为http服务端 ...

  2. 树上差分——点差分裸题 P3128 [USACO15DEC]最大流Max Flow

    讲解: https://rpdreamer.blog.luogu.org/ci-fen-and-shu-shang-ci-fen #include <bits/stdc++.h> #def ...

  3. 使用GetAdaptersInfo时,网卡类型的值为71

    使用GetAdaptersInfo时,网卡类型的值为71,代表无线网卡.

  4. jedis set 的四个重载方法(byte[]的四个自动忽略)

    方法定义如下: 1.String set(String key, String value) 2.String set(String key, String value, String nxxx) 3 ...

  5. LwIP协议栈接口

    协议栈api函数 1.netconn_new      //UDP    TCP struct netconn*netconn_new(enum netconn_type t) 为新连接申请一个连接结 ...

  6. Ubuntu 14.04 LTS 下使用校园网客户端DrclientLinux

    原先博客放弃使用,几篇文章搬运过来 下载客户端并解压 安装开发包 sudo -i dpkg --add-architecture i386 #添加32位的支持 apt-get update apt-g ...

  7. java 支持 超大上G , 多附件上传

    首先 确定要上传的目录 WEB.XML 文件 Java代码   <listener> <listener-class><!-- 临时文件收集器 , 支持超大附件必须项 - ...

  8. HashSet源码

    public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java. ...

  9. Django Model Form

    ModelForm ModelForm结合了Form和Model,将models的field类型映射成forms的field类型,复用了Model和Model验证, 写更少的代码,并且还实现了存储数据 ...

  10. Go Code Review Comments 译文(截止2018年7月27日)

    持续更新中- 原文最新链接 https://github.com/golang/go/wiki/CodeReviewComments/5a40ba36d388ff1b8b2dd4c1c3fe820b8 ...