查找两个字符串中相同字符串_使两个字符串相同的最低成本

查找两个字符串中相同字符串

Problem statement:

问题陈述:

Given two strings string1 and string2 find the minimum cost required to make the given two strings identical. We can delete characters from both the strings. The cost of deleting a character from string1 is costX and string2 is costY. The cost of removing any characters from the same string is the same. Like, removing any

给定两个字符串, string1string2找到使给定两个字符串相同所需的最低成本。 我们可以从两个字符串中删除字符。 从string1删除字符的成本为costX,string2costY 。 从同一字符串中删除任何字符的成本是相同的。 喜欢,删除任何

    Input:
The first line contains integers costX and costY.
The second line contains the two strings X and Y.
Output:
Print the total cost to make the two strings 
equal for each test case in a new line.
Constraints:
1<= length of strings X and Y <=1000
1<= costX, costY <=1000

Explanation of Example:

示例说明:

    Input:
1
10 20
"acba" "acdb"
Output:
30
Explanation:
The similar strings would be "acb". 
So need to remove one from string1 and one from string2 
costing total of 30.

Solution Approach:

解决方法:

The problem can be solved recursively,

该问题可以递归解决,

Let,

让,

    N = length of string1
M = length of string1
F(n,m) = minimum cost to make two strings similar

Let us consider, what can be cases that can arrive for F(i,j) where 0 <= i<n && 0 <= j<m

让我们考虑一下,对于F(i,j) ,其中0 <= i <n && 0 <= j <m

Case 1.

情况1。

string1[i]==string2[j] that is indexed characters are similar

索引字符的string1 [i] == string2 [j]相似

In such a case, we don't need any additional cost to make strings similar, the cost will be similar to sub-problem of size i-1, j-1. This can be recursively written as

在这种情况下,我们不需要使字符串相似的任何额外费用,该费用将类似于大小为i-1 , j-1的子问题。 这可以递归写成

    F(i,j) = F(i-1,j-1) if string1[i] == string2[j]

Case 2.

情况2

string1[i]!=string2[j] that is indexed characters are not similar.

索引字符的string1 [i]!= string2 [j]不相似。

In such a case we need to invest,

在这种情况下,我们需要投资,

  1. One thing can remove the indexed character from string1 and change to indexed string2 character.

    一件事可以从字符串 1中删除索引的字符,然后更改为索引的string2字符。

    This can be recursively written as,

    可以将其写为

        F(i,j) = F(i-1,j) + costX if string1[i] != string2[j]
    
    
  2. Another way can be to remove the indexed character from string2 and change to string1 indexed character.

    另一种方法是从string2删除索引字符,然后更改为string1索引字符。

    This can be recursively written as,

    可以将其写为

        F(i,j) = F(i,j-1) + costY if string1[i] != string2[j]
    
    
  3. Remove characters from both.

    从两者中删除字符。

    This can be recursively written as,

    可以将其写为

        F(i,j) = F(i-1,j-1) + costY + costX if string1[i] != string2[j]
    
    Finally, we would take minimum out of this three cases.
    

So here goes the problem structure,

所以这里是问题的结构,

Now the above recursion will create many overlapping subproblems and hence we need two converts it into DP.

现在,上述递归将创建许多重叠的子问题,因此我们需要两次将其转换为DP。

Converting into DP

转换为DP

    n = string1 length
m = string2 length
str1 = string1
str2 = string2
1)  Declare int dp[n+1][m+1];
2)  Base case
for i=0 to n
dp[i][0]=i*costX;
for j=0 to m
dp[0][j]=j*costY;
3)  Fill the DP
for i=1 to n
for j=1 to m
//first case when str1[i-1]==str2[j-1]
dp[i][j]=dp[i-1][j-1];  
if(str1[i-1]!=str2[j-1])
dp[i][j]+=costX+costY;
dp[i][j]=min(dp[i][j],min(dp[i-1][j]+costX,dp[i][j-1]+costY));
end if
end for
end for
4)  return dp[n][m]; 

C++ Implementation:

C ++实现:

#include <bits/stdc++.h>
using namespace std;
int editdistance(string s1, string s2, int costX, int costY)
{
int n = s1.length();
int m = s2.length();
int dp[n + 1][m + 1];
for (int i = 0; i <= n; i++)
dp[i][0] = i * costX;
for (int j = 0; j <= m; j++)
dp[0][j] = j * costY;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
dp[i][j] = dp[i - 1][j - 1];
if (s1[i - 1] != s2[j - 1]) {
dp[i][j] += costX + costY;
dp[i][j] = min(dp[i][j], min(dp[i - 1][j] + costX, dp[i][j - 1] + costY));
}
}
}
return dp[n][m];
}
int main()
{
int costX, costY;
cout << "Cost of changing/removing character from string1: \n";
cin >> costX;
cout << "Cost of changing/removing character from string2: \n";
cin >> costY;
string s1, s2;
cout << "Input string1\n";
cin >> s1;
cout << "Input string2\n";
cin >> s2;
cout << "Minimum cost to make two string similar: " << editdistance(s1, s2, costX, costY) << endl;
return 0;
}

Output

输出量

Cost of changing/removing character from string1: 
2
Cost of changing/removing character from string2: 
3
Input string1
includehelp
Input string2
includuggu
Minimum cost to make two string similar: 22

翻译自: https://www.includehelp.com/icp/minimum-cost-to-make-two-strings-identical.aspx

查找两个字符串中相同字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab对指定参数的曲线进行非线性拟合

Matlab拟合曲线的方式 Matlab拟合曲线的方式有很多种&#xff0c;有三次样条插值、线性插值、多项式拟合等等。多项式拟合由于函数由f(x)anxnan−1xn−1...a1xa0f(x)a_nx^na_{n-1}x^{n-1}...a_1xa_0f(x)an​xnan−1​xn−1...a1​xa0​组成&#xff0c;若采用最小二乘法拟合&a…

MyBatis原生批量插入的坑与解决方案!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;前面的文章咱们讲了 MyBatis 批量插入的 3 种方法&#xff1a;循环单次插入、MyBatis Plus 批量插入、MyBatis 原生批量插入…

系统结构图 数据结构_数据结构图简介

系统结构图 数据结构What you are going to learn? 你要学什么&#xff1f; In this article, we learn about the introduction to Graphs in Data Structure and Algorithm. 在本文中&#xff0c;我们将了解图在数据结构和算法中的介绍 。 What are the components in Gra…

Matlab仿真PID控制(带M文件、simulink截图和参数分析)

文章目录0.符号说明1.如何根据连续系统建立差分方程1.1.获取连续系统的传递函数1.2.获取离散系统的传递函数1.3.转换为差分方程2.基本PID控制原理3.比较PID输出&#xff0c;分析参数产生的影响4.改进PID算法&#xff08;遇限削弱积分法&#xff09;5.simulink仿真0.符号说明 y…

再见 Postman!Apifox 才是 YYDS!

作为开软件开发从业者&#xff0c;API 调试是必不可少的一项技能&#xff0c;在这方面 Postman 做的非常出色。但是在整个软件开发过程中&#xff0c;API 调试只是其中的一部分&#xff0c;还有很多事情 Postman 无法完成&#xff0c;或者无法高效完成&#xff0c;比如&#xf…

Matlab【可视化作图】绘制线电压相电压辅助线

目录引言绘图原理采点绘图设置坐标轴标尺引言 学习电力电子的同学可能在私下里练习的时候非常需要三相线电压和相电压的辅助线。最近我随便找了一本书把Matlab可视化编程恶补了一下&#xff0c;给大家介绍一下这个波形辅助线是怎么做的。 三相线电压辅助线就是一组相位相差60的…

SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了!

在我们平时工作中经常会遇到要操作Excel的功能&#xff0c;比如导出个用户信息或者订单信息的Excel报表。你肯定听说过POI这个东西&#xff0c;可以实现。但是POI实现的API确实很麻烦&#xff0c;它需要写那种逐行解析的代码&#xff08;类似Xml解析&#xff09;。今天给大家推…

Facebook升级到MySQL 8.0付出的代价

近日&#xff0c;Facebook 官博公布了他们的数据库版本从 MySQL 5.6 升级到了 MySQL 8.0&#xff0c;并且在官博记录了复盘详细的升级过程。Facebook 称&#xff0c;他们最近的一次大版本升级到 MySQL 5.6 花了一年多时间才完成&#xff0c;还在 5.6 版上开发 LSM 树存储引擎&a…

Matlab制作朱利表

朱利判据 其中 {bn−kan−k−ana0∗akcn−kbn−k−bnb0∗bk...qn−kpn−k−pnp0∗pk\begin{cases} b_{n-k}a_{n-k}-\frac{a_n}{a_0}*a_k\\ c_{n-k}b_{n-k}-\frac{b_n}{b_0}*b_k\\ ...\\ q_{n-k}p_{n-k}-\frac{p_n}{p_0}*p_k \end{cases}⎩⎪⎪⎪⎨⎪⎪⎪⎧​bn−k​an−k​−a0…

高并发下秒杀商品,必须知道的9个细节

高并发下如何设计秒杀系统&#xff1f;这是一个高频面试题。这个问题看似简单&#xff0c;但是里面的水很深&#xff0c;它考查的是高并发场景下&#xff0c;从前端到后端多方面的知识。秒杀一般出现在商城的促销活动中&#xff0c;指定了一定数量&#xff08;比如&#xff1a;…

最小拍控制系统详细解读(阶跃输入+速度输入2个案例)【Simulink仿真】

目录索引1.符号说明与结构框图2.最小拍控制系统构造原则2.1数字控制器D(z)的构造3.简单控制对象的最小拍控制器设计3.1阶跃输入3.2速度输入1.符号说明与结构框图 y(k)——系统响应输出的离散值u(k)——数字PID控制输出的离散值r(k)——期望输出的离散值&#xff08;事先已知&a…

SpringBoot官方热部署和远程调试神器,真带劲!

平时使用SpringBoot开发应用时&#xff0c;修改代码后需要重新启动才能生效。如果你的应用足够大的话&#xff0c;启动可能需要好几分钟。有没有什么办法可以加速启动过程&#xff0c;让我们开发应用代码更高效呢&#xff1f;今天给大家推荐一款SpringBoot官方的热部署工具spri…

【Python】输入任意个数元素并保存至列表

目录1.导入任意个数元素到列表1.1.编程思路1.2.代码片2.查找一个重复元素在列表中的所有位置2.1.编程思路2.2代码片1.导入任意个数元素到列表 1.1.编程思路 输入未知个数的元素需要用列表来存储&#xff0c;由于Python具有内存的动态分配能力&#xff0c;列表不需要手动动态分…

MySQL 性能优化的 9 种姿势,面试再也不怕了!

大家好&#xff0c;我是磊哥&#xff01;今天给大家分享一些简单好用的数据库优化方式&#xff01;1、选择最合适的字段属性Mysql是一种关系型数据库&#xff0c;可以很好地支持大数据量的存储&#xff0c;但是一般来说&#xff0c;数据库中的表越小&#xff0c;在它上面执行的…

Excel的规划求解【详细步骤】

本文目录1.说明2.准备加载项步骤1步骤2步骤33.线性规划问题步骤4步骤5步骤61.说明 使用Lingo程序也可以实现线性规划、非线性规划以及0-1规划&#xff0c;但是在缺少Lingo程序的情况下&#xff0c;我们使用Excel照样可以很容易地完成。在这里我给大家提供了解决此类问题的详细…

4 种方法!检查字符串是否为合法的日期格式

哈喽大家好&#xff0c;今天咱们来讲一下&#xff0c;Java 中如何检查一个字符串是否是合法的日期格式&#xff1f;为什么要检查时间格式&#xff1f;后端接口在接收数据的时候&#xff0c;都需要进行检查。检查全部通过后&#xff0c;才能够执行业务逻辑。对于时间格式&#x…

【Matlab】根据图生成带权邻接矩阵,并求出最短路径

目录图的简介无向图&#xff08;Graph&#xff09;生成带权邻接矩阵求两点最短路径有向图&#xff08;Digraph&#xff09;生成带权邻接矩阵求最短路径图的简介 图是拓扑学中的一个重要概念&#xff0c;分为无向图和有向图两种。图有两个重要属性&#xff0c;即点&#xff08;…

阿里二面:为什么要分库分表?

在高并发系统当中&#xff0c;分库分表是必不可少的技术手段之一&#xff0c;同时也是BAT等大厂面试时&#xff0c;经常考的热门考题。你知道我们为什么要做分库分表吗&#xff1f;这个问题要从两条线说起&#xff1a;垂直方向 和 水平方向。1 垂直方向垂直方向主要针对的是业务…

Java 中 List 分片的 5 种方法!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;前些天在实现 MyBatis 批量插入时遇到了一个问题&#xff0c;当批量插入的数据量比较大时&#xff0c;会导致程序执行报错&a…

Matlab仿真炮弹飞行轨迹——探究射弹参数对飞行轨迹的影响

目录1.分析炮弹受力2.设定参数并仿真3.通过仿真寻找最佳射弹速度3.1.射弹角度的影响3.2.射弹速率的影响3.3.炮弹属性和空气的影响3.3.1.空气阻力系数的影响3.3.2.炮弹质量的影响1.分析炮弹受力 假设炮弹在飞行过程中可以看成质点&#xff0c;运动时仅考虑初始速度、重力加速度…