给定两个数字字符串A 和 B。数字字符串是仅包含数字 [‘0’-‘9’] 的字符串。
任务是使两个字符串以最小成本相等。您可以执行的唯一操作是从任何字符串(A 或 B)中删除一个字符(即数字)。删除一个数字 D 的成本是 D 个单位。
例子:
Input : A = “7135”, B = “135”
Output : 7
To make both string identical we have to delete ‘7’ from string A.
Input : A = “9142”, B = “1429”
Output : 14
There are 2 ways to make string “9142” identical to “1429” i.e either by deleting ‘9’ from both the strings or by deleting ‘1’, ‘4’and ‘2’ from both the string. Deleting 142 from both the string will cost 2*(1+4+2)=14 which is more optimal than deleting ‘9’.
这个问题是流行的动态规划问题——最长公共子序列的变体。这个想法是找到最大权重的公共子序列,这将是我们所需的最佳相同字符串。要找到删除成本,从字符串A 和 B 的总和中减去最大权重公共子序列的总和。
Minimum weight to make string identical = costA + costB – 2*(cost of LCS)
下面是上述想法的实现:
C++
// CPP program to find minimum cost to make
// two numeric strings identical
#include
using namespace std;
typedef long long int ll;
// Function to find weight of LCS
int lcs(int dp[101][101], string a, string b,
int m, int n)
{
for (int i = 0; i < 100; i++)
for (int j = 0; j < 100; j++)
dp[i][j] = -1;
if (m < 0 || n < 0) {
return 0;
}
// if this state is already
// calculated then return
if (dp[m][n] != -1)
return dp[m][n];
int ans = 0;
if (a[m] == b[n]) {
// adding required weight for
// particular match
ans = int(a[m] - 48) + lcs(dp, a, b,
m - 1, n - 1);
}
else
// recurse for left and right child
// and store the max
ans = max(lcs(dp, a, b, m - 1, n),
lcs(dp, a, b, m, n - 1));
dp[m][n] = ans;
return ans;
}
// Function to calculate cost of string
int costOfString(string str)
{
int cost = 0;
for (int i = 0; i < str.length(); i++)
cost += int(str[i] - 48);
return cost;
}
// Driver code
int main()
{
string a, b;
a = "9142";
b = "1429";
int dp[101][101];
// Minimum cost needed to make two strings identical
cout << (costOfString(a) + costOfString(b) -
2 * lcs(dp, a, b, a.length() - 1,
b.length() - 1));
return 0;
}
Java
// Java program to find minimum cost to make
// two numeric strings identical
import java.io.*;
class GFG {
// Function to find weight of LCS
static int lcs(int dp[][], String a, String b,
int m, int n)
{
for (int i = 0; i < 100; i++)
for (int j = 0; j < 100; j++)
dp[i][j] = -1;
if (m < 0 || n < 0) {
return 0;
}
// if this state is already
// calculated then return
if (dp[m][n] != -1)
return dp[m][n];
int ans = 0;
if (a.charAt(m) == b.charAt(n)) {
// adding required weight for
// particular match
ans = (a.charAt(m) - 48) + lcs(dp, a, b,
m - 1, n - 1);
}
else
// recurse for left and right child
// and store the max
ans = Math.max(lcs(dp, a, b, m - 1, n),
lcs(dp, a, b, m, n - 1));
dp[m][n] = ans;
return ans;
}
// Function to calculate cost of string
static int costOfString(String str)
{
int cost = 0;
for (int i = 0; i < str.length(); i++)
cost += (str.charAt(i) - 48);
return cost;
}
// Driver code
public static void main (String[] args) {
String a, b;
a = "9142";
b = "1429";
int dp[][] = new int[101][101];
// Minimum cost needed to make two strings identical
System.out.print( (costOfString(a) + costOfString(b) -
2 * lcs(dp, a, b, a.length() - 1,
b.length() - 1)));
}
}
// This code is contributed by anuj_67.
Python 3
# Python 3 program to find minimum cost
# to make two numeric strings identical
# Function to find weight of LCS
def lcs(dp, a, b, m, n):
for i in range(100):
for j in range(100):
dp[i][j] = -1
if (m < 0 or n < 0) :
return 0
# if this state is already calculated
# then return
if (dp[m][n] != -1):
return dp[m][n]
ans = 0
if (a[m] == b[n]):
# adding required weight for
# particular match
ans = (ord(a[m]) - 48) + lcs(dp, a, b,
m - 1, n - 1)
else:
# recurse for left and right child
# and store the max
ans = max(lcs(dp, a, b, m - 1, n),
lcs(dp, a, b, m, n - 1))
dp[m][n] = ans
return ans
# Function to calculate cost of string
def costOfString(s):
cost = 0
for i in range(len(s)):
cost += (ord(s[i]) - 48)
return cost
# Driver code
if __name__ == "__main__":
a = "9142"
b = "1429"
dp = [[0 for x in range(101)]
for y in range(101)]
# Minimum cost needed to make two
# strings identical
print(costOfString(a) + costOfString(b) - 2 *
lcs(dp, a, b, len(a) - 1, len(b) - 1))
# This code is contributed by ita_c
C#
// C# program to find minimum cost to make
// two numeric strings identical
using System;
public class GFG {
// Function to find weight of LCS
static int lcs(int [,]dp, String a, String b,
int m, int n)
{
for (int i = 0; i < 100; i++)
for (int j = 0; j < 100; j++)
dp[i,j] = -1;
if (m < 0 || n < 0) {
return 0;
}
// if this state is already
// calculated then return
if (dp[m,n] != -1)
return dp[m,n];
int ans = 0;
if (a[m] == b[n]) {
// adding required weight for
// particular match
ans = (a[m] - 48) + lcs(dp, a, b, m - 1, n - 1);
}
else
// recurse for left and right child
// and store the max
ans = Math.Max(lcs(dp, a, b, m - 1, n),
lcs(dp, a, b, m, n - 1));
dp[m,n] = ans;
return ans;
}
// Function to calculate cost of string
static int costOfString(String str)
{
int cost = 0;
for (int i = 0; i < str.Length; i++)
cost += (str[i] - 48);
return cost;
}
// Driver code
public static void Main () {
String a, b;
a = "9142";
b = "1429";
int [,]dp = new int[101,101];
// Minimum cost needed to make two strings identical
Console.Write( (costOfString(a) + costOfString(b) -
2 * lcs(dp, a, b, a.Length- 1,
b.Length - 1)));
}
}
// This code is contributed by Rajput-Ji
Javascript
14
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。