给定两个仅由数字“ 0”至“ 9”组成的字符串X和Y。找到使给定的两个字符串相同所需的最低成本。唯一允许的操作是从任何字符串删除字符。删除数字“ d”的操作成本为d个单位。
Input: X = 3759, Y = 9350
Output: 23
Explanation
For making both string identical, delete
characters 3, 7, 5 from first string and
delete characters 3, 5, 0 from second
string. Total cost of operation is
3 + 7 + 5 + 3 + 5 + 0 = 23
Input: X = 3198, Y = 98
Output: 4
这个问题是最长公共子序列(LCS)的变体。这个想法很简单,而不是找到最长的公共子序列的长度,而是通过在两个字符串添加相同的字符来找到最大的开销。
现在,要找到最低成本,请从两个字符串的总成本中减去上述结果,即
costX = Cost of removing all characters
from string 'X'
CostY = Cost of removing all characters
from string 'Y'
cost_Id = Cost of removing identical characters
from both strings
Minimum cost to make both string identical =
costX + costY - cost_Id
下面是上述方法的实现:
C++
/* C++ code to find minimum cost to make two strings
identical */
#include
using namespace std;
/* Function to returns cost of removing the identical
characters in LCS for X[0..m-1], Y[0..n-1] */
int lcs(char* X, char* Y, int m, int n)
{
int L[m + 1][n + 1];
/* Following steps build L[m+1][n+1] in bottom
up fashion. Note that L[i][j] contains cost
of removing identical characters in LCS of
X[0..i-1] and Y[0..j-1] */
for (int i = 0; i <= m; ++i) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0)
L[i][j] = 0;
// If both characters are same, add both
// of them
else if (X[i - 1] == Y[j - 1])
L[i][j] = L[i - 1][j - 1] +
2 * (X[i - 1] - '0');
// Otherwise find the maximum cost among them
else
L[i][j] = max(L[i - 1][j], L[i][j - 1]);
}
}
return L[m][n];
}
// Returns cost of making X[] and Y[] identical
int findMinCost(char X[], char Y[])
{
// Find LCS of X[] and Y[]
int m = strlen(X), n = strlen(Y);
// Initialize the cost variable
int cost = 0;
// Find cost of all characters in
// both strings
for (int i = 0; i < m; ++i)
cost += X[i] - '0';
for (int i = 0; i < n; ++i)
cost += Y[i] - '0';
return cost - lcs(X, Y, m, n);
}
/* Driver program to test above function */
int main()
{
char X[] = "3759";
char Y[] = "9350";
cout << "Minimum Cost to make two strings "
<< "identical is = " << findMinCost(X, Y);
return 0;
}
Java
// Java code to find minimum cost to
// make two strings identical
import java.util.*;
import java.lang.*;
public class GfG{
/* Function to returns cost of removing the identical
characters in LCS for X[0..m-1], Y[0..n-1] */
static int lcs(char[] X, char[] Y, int m, int n)
{
int[][] L=new int[m + 1][n + 1];
/* Following steps build L[m+1][n+1] in
bottom up fashion. Note that L[i][j] contains
cost of removing identical characters in
LCS of X[0..i-1] and Y[0..j-1] */
for (int i = 0; i <= m; ++i) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0)
L[i][j] = 0;
// If both characters are same,
// add both of them
else if (X[i - 1] == Y[j - 1])
L[i][j] = L[i - 1][j - 1] +
2 * (X[i - 1] - '0');
// Otherwise find the maximum
// cost among them
else
L[i][j] = L[i - 1][j] > L[i][j - 1] ?
L[i - 1][j] : L[i][j - 1];
}
}
return L[m][n];
}
// Returns cost of making X[] and Y[] identical
static int findMinCost(char X[], char Y[])
{
// Find LCS of X[] and Y[]
int m = X.length, n = Y.length;
// Initialize the cost variable
int cost = 0;
// Find cost of all characters in
// both strings
for (int i = 0; i < m; ++i)
cost += X[i] - '0';
for (int i = 0; i < n; ++i)
cost += Y[i] - '0';
return cost - lcs(X, Y, m, n);
}
// driver function
public static void main(String argc[]){
char X[] = ("3759").toCharArray();
char Y[] = ("9350").toCharArray();
System.out.println("Minimum Cost to make two strings"+
" identical is = " +findMinCost(X, Y));
}
}
// This code is contributed by Prerna Saini
Python3
# Python3 code to find minimum cost to make two strings
# identical
# Function to returns cost of removing the identical
# characters in LCS for X[0..m-1], Y[0..n-1]
def lcs(X, Y, m, n):
L=[[0 for i in range(n+1)]for i in range(m+1)]
# Following steps build L[m+1][n+1] in bottom
# up fashion. Note that L[i][j] contains cost
# of removing identical characters in LCS of
# X[0..i-1] and Y[0..j-1]
for i in range(m+1):
for j in range(n+1):
if (i == 0 or j == 0):
L[i][j] = 0
# If both characters are same, add both
# of them
elif (X[i - 1] == Y[j - 1]):
L[i][j] = L[i - 1][j - 1] + 2 * (ord(X[i - 1]) - 48)
# Otherwise find the maximum cost among them
else:
L[i][j] = max(L[i - 1][j], L[i][j - 1])
return L[m][n]
# Returns cost of making X[] and Y[] identical
def findMinCost( X, Y):
# Find LCS of X[] and Y[]
m = len(X)
n = len(Y)
# Initialize the cost variable
cost = 0
# Find cost of all acters in
# both strings
for i in range(m):
cost += ord(X[i]) - 48
for i in range(n):
cost += ord(Y[i]) - 48
ans=cost - lcs(X, Y, m, n)
return ans
# Driver program to test above function
X = "3759"
Y = "9350"
print("Minimum Cost to make two strings ",
"identical is = " ,findMinCost(X, Y))
#this code is contributed by sahilshelangia
C#
// C# code to find minimum cost to
// make two strings identical
using System;
public class GfG{
/* Function to returns cost of removing the identical
characters in LCS for X[0..m-1], Y[0..n-1] */
static int lcs(string X, string Y, int m, int n)
{
int [,]L=new int[m + 1,n + 1];
/* Following steps build L[m+1][n+1] in
bottom up fashion. Note that L[i][j] contains
cost of removing identical characters in
LCS of X[0..i-1] and Y[0..j-1] */
for (int i = 0; i <= m; ++i) {
for (int j = 0; j <= n; j++) {
if (i == 0 || j == 0)
L[i,j] = 0;
// If both characters are same,
// add both of them
else if (X[i - 1] == Y[j - 1])
L[i,j] = L[i - 1,j - 1] +
2 * (X[i - 1] - '0');
// Otherwise find the maximum
// cost among them
else
L[i,j] = L[i - 1,j] > L[i,j - 1] ?
L[i - 1,j] : L[i,j - 1];
}
}
return L[m,n];
}
// Returns cost of making X[] and Y[] identical
static int findMinCost( string X, string Y)
{
// Find LCS of X[] and Y[]
int m = X.Length, n = Y.Length;
// Initialize the cost variable
int cost = 0;
// Find cost of all characters in
// both strings
for (int i = 0; i < m; ++i)
cost += X[i] - '0';
for (int i = 0; i < n; ++i)
cost += Y[i] - '0';
return cost - lcs(X, Y, m, n);
}
// Driver function
public static void Main()
{
string X = "3759";
string Y= "9350";
Console.WriteLine("Minimum Cost to make two strings"+
" identical is = " +findMinCost(X, Y));
}
}
// This code is contributed by vt_m
PHP
$L[$i][$j - 1] ?
$L[$i - 1][$j] : $L[$i][$j - 1];
}
}
return $L[$m][$n];
}
// Returns cost of making X[] and Y[] identical
function findMinCost($X, $Y)
{
// Find LCS of X[] and Y[]
$m = sizeof($X); $n = sizeof($Y);
// Initialize the cost variable
$cost = 0;
// Find cost of all characters in
// both strings
for ($i = 0; $i < $m; ++$i)
$cost += $X[$i] - '0';
for ($i = 0; $i < $n; ++$i)
$cost += $Y[$i] - '0';
return $cost - lcs($X, $Y, $m, $n);
}
// Driver code
$X = str_split("3759");
$Y = str_split("9350");
echo("Minimum Cost to make two strings".
" identical is = " .findMinCost($X, $Y));
// This code is contributed by Code_Mech.
输出:
Minimum Cost to make two strings identical is = 23
时间复杂度: O(m * n)
辅助空间: O(m * n)