【leet-code】712. 两个字符串的最小ASCII删除和
题目描述
给定两个字符串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删除和的更多相关文章
- Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings)
Leetcode之动态规划(DP)专题-712. 两个字符串的最小ASCII删除和(Minimum ASCII Delete Sum for Two Strings) 给定两个字符串s1, s2,找到 ...
- Java实现 LeetCode 712 两个字符串的最小ASCII删除和(最长公共子串&&ASCII值最小)
712. 两个字符串的最小ASCII删除和 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 ...
- Leetcode 712. 两个字符串的最小ASCII删除和
题目描述: https://leetcode-cn.com/problems/minimum-ascii-delete-sum-for-two-strings/ 解题思路: 也是典型的dp问题.利用二 ...
- [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. ...
- Q712 两个字符串的最小ASCII删除和
给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" 输出: ...
- [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. ...
- 算法61---两个字符串的最小ASCII删除和【动态规划】
一.题目: 给定两个字符串s1, s2,找到使两个字符串相等所需删除字符的ASCII值的最小和. 示例 1: 输入: s1 = "sea", s2 = "eat" ...
- Leet Code 2.两数相加
2.两数相加 题目描述 给出两个非空的链表用来表示两个非负的整数.其中,它们各自的位数是按照逆序的方式存储的,并且它们的每个节点只能存储一位数字.如果,我们将这两个数相加起来,则会返回一个新的链表来表 ...
随机推荐
- 【NIFI】 Apache NiFI 之 ExecuteScript处理(二)
本例介绍NiFI ExecuteScript处理器的使用,使用的脚本引擎ECMScript 接上一篇[NIFI] Apache NiFI 之 ExecuteScript处理(一) ExecuteScr ...
- java动态生成验证码图片
package cn.lijun.checkimg; import java.awt.image.BufferedImage;import java.io.BufferedReader; import ...
- Hibernate 基础入门
概述: JDBC:将java和数据库连接的驱动程序加载到项目中,在代码里面,注册驱动,创建链接,创建satement对象,发送并执行sql之类,关闭连接. hibernate :数据持久化一个框架,对 ...
- Nginx unit 源码安装初体验
Nginx unit 源码安装初体验 上次介绍了从yum的安装方法(https://www.cnblogs.com/wang-li/p/9684040.html),这次将介绍源码安装,目前最新版为1. ...
- Python学习第四章
1.类和对象: 类对象支持两种操作:属性引用和实例化. 属性引用:obj.name 构造方法:类会定义一个名为__int__()的特殊方法如下 def __init__(self): s ...
- 你应该这么理解TCP的三次握手和四次挥手
前言: TCP协议是计算机的基础,他本身是一个非常非常复杂的协议. 本文只是蜻蜓点水,将从网络基础以及TCP的相关概念介绍开始,之后再将三次握手,四次挥手这些内容来阐述. 最后介绍一些常见问题,并给出 ...
- 解决“UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 24051: illegal multibyte sequence”错误
今天我在爬取一个网页时出现了下面这个错误: UnicodeEncodeError: 'gbk' codec can't encode character u'\xa9' in position 240 ...
- 论如何优雅地拿下PHPCMS
作者:J0o1ey 原文来自:论如何优雅地拿下PHPCMS 一.PHPCM PHP是国内领先的网站内容管理系统,同时也是一个开源的PHP开发框架,采用PHP5+MYSQL进行开发,拥有非常 ...
- python实用基本之--golb.glob
python的强大的原因就是有很多非常实用的模块.今天用到了一个读取文件内容的小模块,做个记录: #!/usr/bin/python # -*- coding: utf-8 -*- import os ...
- 自学vue笔记 (二) : 实例与生命周期
一: 什么是实例 我们说了,Vue 应用都应该从构建一个 Vue 实例开始.它管理着挂载在它身上的所有内容,因此实例是一个根实例, 所有的组件都应该挂载在根实例上面.创建一个 Vue 实例,需要通过 ...