Minimum Cost To Make Two Strings Identical
Last Updated :
20 Dec, 2022
Given two strings X and Y, and two values costX and costY. We need to find 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 string X is costX and from Y is costY. Cost of removing all characters from a string is same.
Examples :
Input : X = "abcd", Y = "acdb", costX = 10, costY = 20.
Output: 30
For Making both strings identical we have to delete
character 'b' from both the string, hence cost will
be = 10 + 20 = 30.
Input : X = "ef", Y = "gh", costX = 10, costY = 20.
Output: 60
For making both strings identical, we have to delete 2-2
characters from both the strings, hence cost will be =
10 + 10 + 20 + 20 = 60.
This problem is a variation of Longest Common Subsequence ( LCS ). The idea is simple, we first find the length of longest common subsequence of strings X and Y. Now subtracting len_LCS with lengths of individual strings gives us number of characters to be removed to make them identical.
// Cost of making two strings identical is SUM of following two
// 1) Cost of removing extra characters (other than LCS)
// from X[]
// 2) Cost of removing extra characters (other than LCS)
// from Y[]
Minimum Cost to make strings identical = costX * (m - len_LCS) +
costY * (n - len_LCS).
m ==> Length of string X
m ==> Length of string Y
len_LCS ==> Length of LCS Of X and Y.
costX ==> Cost of removing a character from X[]
costY ==> Cost of removing a character from Y[]
Note that cost of removing all characters from a string
is same.
Below is the implementation of above idea.
C++
/* C++ code to find minimum cost to make two strings
identical */
#include<bits/stdc++.h>
using namespace std;
/* Returns length of 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 length
of 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;
else if (X[i-1] == Y[j-1])
L[i][j] = L[i-1][j-1] + 1;
else
L[i][j] = max(L[i-1][j], L[i][j-1]);
}
}
/* L[m][n] contains length of LCS for X[0..n-1] and
Y[0..m-1] */
return L[m][n];
}
// Returns cost of making X[] and Y[] identical. costX is
// cost of removing a character from X[] and costY is cost
// of removing a character from Y[]/
int findMinCost(char X[], char Y[], int costX, int costY)
{
// Find LCS of X[] and Y[]
int m = strlen(X), n = strlen(Y);
int len_LCS = lcs(X, Y, m, n);
// Cost of making two strings identical is SUM of
// following two
// 1) Cost of removing extra characters
// from first string
// 2) Cost of removing extra characters from
// second string
return costX * (m - len_LCS) +
costY * (n - len_LCS);
}
/* Driver program to test above function */
int main()
{
char X[] = "ef";
char Y[] = "gh";
cout << "Minimum Cost to make two strings "
<< " identical is = " << findMinCost(X, Y, 10, 20);
return 0;
}
Java
// Java code to find minimum cost to
// make two strings identical
import java.io.*;
class GFG {
// Returns length of 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 length
of 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;
else if (X.charAt(i - 1) == Y.charAt(j - 1))
L[i][j] = L[i - 1][j - 1] + 1;
else
L[i][j] = Math.max(L[i - 1][j], L[i][j - 1]);
}
}
// L[m][n] contains length of LCS
// for X[0..n-1] and Y[0..m-1]
return L[m][n];
}
// Returns cost of making X[] and Y[] identical.
// costX is cost of removing a character from X[]
// and costY is cost of removing a character from Y[]/
static int findMinCost(String X, String Y, int costX, int costY)
{
// Find LCS of X[] and Y[]
int m = X.length();
int n = Y.length();
int len_LCS;
len_LCS = lcs(X, Y, m, n);
// Cost of making two strings identical
// is SUM of following two
// 1) Cost of removing extra characters
// from first string
// 2) Cost of removing extra characters
// from second string
return costX * (m - len_LCS) +
costY * (n - len_LCS);
}
// Driver code
public static void main (String[] args)
{
String X = "ef";
String Y = "gh";
System.out.println( "Minimum Cost to make two strings "
+ " identical is = "
+ findMinCost(X, Y, 10, 20));
}
}
// This code is contributed by vt_m
Python3
# Python code to find minimum cost
# to make two strings identical
# Returns length of 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 length
# of 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
else if X[i - 1] == Y[j - 1]:
L[i][j] = L[i - 1][j - 1] + 1
else:
L[i][j] = max(L[i - 1][j],
L[i][j - 1])
# L[m][n] contains length of
# LCS for X[0..n-1] and Y[0..m-1]
return L[m][n]
# Returns cost of making X[]
# and Y[] identical. costX is
# cost of removing a character
# from X[] and costY is cost
# of removing a character from Y[]
def findMinCost(X, Y, costX, costY):
# Find LCS of X[] and Y[]
m = len(X)
n = len(Y)
len_LCS =lcs(X, Y, m, n)
# Cost of making two strings
# identical is SUM of following two
# 1) Cost of removing extra
# characters from first string
# 2) Cost of removing extra
# characters from second string
return (costX * (m - len_LCS) +
costY * (n - len_LCS))
# Driver Code
X = "ef"
Y = "gh"
print('Minimum Cost to make two strings ', end = '')
print('identical is = ', findMinCost(X, Y, 10, 20))
# This code is contributed
# by sahilshelangia
C#
// C# code to find minimum cost to
// make two strings identical
using System;
class GFG {
// Returns length of 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 length
of 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;
else if (X[i - 1] == Y[j - 1])
L[i,j] = L[i - 1,j - 1] + 1;
else
L[i,j] = Math.Max(L[i - 1,j], L[i,j - 1]);
}
}
// L[m][n] contains length of LCS
// for X[0..n-1] and Y[0..m-1]
return L[m,n];
}
// Returns cost of making X[] and Y[] identical.
// costX is cost of removing a character from X[]
// and costY is cost of removing a character from Y[]
static int findMinCost(String X, String Y,
int costX, int costY)
{
// Find LCS of X[] and Y[]
int m = X.Length;
int n = Y.Length;
int len_LCS;
len_LCS = lcs(X, Y, m, n);
// Cost of making two strings identical
// is SUM of following two
// 1) Cost of removing extra characters
// from first string
// 2) Cost of removing extra characters
// from second string
return costX * (m - len_LCS) +
costY * (n - len_LCS);
}
// Driver code
public static void Main ()
{
String X = "ef";
String Y = "gh";
Console.Write( "Minimum Cost to make two strings " +
" identical is = " +
findMinCost(X, Y, 10, 20));
}
}
// This code is contributed by nitin mittal.
PHP
<?php
/* PHP code to find minimum cost to make two strings
identical */
/* Returns length of LCS for X[0..m-1], Y[0..n-1] */
function lcs($X, $Y, $m, $n)
{
$L = array_fill(0,($m+1),array_fill(0,($n+1),NULL));
/* Following steps build L[m+1][n+1] in bottom
up fashion. Note that L[i][j] contains length
of LCS of X[0..i-1] and Y[0..j-1] */
for ($i=0; $i<=$m; $i++)
{
for ($j=0; $j<=$n; $j++)
{
if ($i == 0 || $j == 0)
$L[$i][$j] = 0;
else if ($X[$i-1] == $Y[$j-1])
$L[$i][$j] = $L[$i-1][$j-1] + 1;
else
$L[$i][$j] = max($L[$i-1][$j], $L[$i][$j-1]);
}
}
/* L[m][n] contains length of LCS for X[0..n-1] and
Y[0..m-1] */
return $L[$m][$n];
}
// Returns cost of making X[] and Y[] identical. costX is
// cost of removing a character from X[] and costY is cost
// of removing a character from Y[]/
function findMinCost(&$X, &$Y,$costX, $costY)
{
// Find LCS of X[] and Y[]
$m = strlen($X);
$n = strlen($Y);
$len_LCS = lcs($X, $Y, $m, $n);
// Cost of making two strings identical is SUM of
// following two
// 1) Cost of removing extra characters
// from first string
// 2) Cost of removing extra characters from
// second string
return $costX * ($m - $len_LCS) +
$costY * ($n - $len_LCS);
}
/* Driver program to test above function */
$X = "ef";
$Y = "gh";
echo "Minimum Cost to make two strings ".
" identical is = " . findMinCost($X, $Y, 10, 20);
return 0;
?>
JavaScript
<script>
// Javascript code to find minimum cost to
// make two strings identical
// Returns length of LCS for X[0..m-1], Y[0..n-1]
function lcs(X, Y, m, n)
{
let L = new Array(m+1);
for(let i = 0; i < m + 1; i++)
{
L[i] = new Array(n + 1);
}
for(let i = 0; i < m + 1; i++)
{
for(let j = 0; j < n + 1; j++)
{
L[i][j] = 0;
}
}
/* Following steps build L[m+1][n+1] in bottom
up fashion. Note that L[i][j] contains length
of LCS of X[0..i-1] and Y[0..j-1] */
for (let i = 0; i <= m; i++)
{
for (let j = 0; j <= n; j++)
{
if (i == 0 || j == 0)
L[i][j] = 0;
else if (X[i-1] == Y[j-1])
L[i][j] = L[i - 1][j - 1] + 1;
else
L[i][j] = Math.max(L[i - 1][j], L[i][j - 1]);
}
}
// L[m][n] contains length of LCS
// for X[0..n-1] and Y[0..m-1]
return L[m][n];
}
// Returns cost of making X[] and Y[] identical.
// costX is cost of removing a character from X[]
// and costY is cost of removing a character from Y[]/
function findMinCost(X,Y,costX,costY)
{
// Find LCS of X[] and Y[]
let m = X.length;
let n = Y.length;
let len_LCS;
len_LCS = lcs(X, Y, m, n);
// Cost of making two strings identical
// is SUM of following two
// 1) Cost of removing extra characters
// from first string
// 2) Cost of removing extra characters
// from second string
return costX * (m - len_LCS) +
costY * (n - len_LCS);
}
// Driver code
let X = "ef";
let Y = "gh";
document.write( "Minimum Cost to make two strings "
+ " identical is = "
+ findMinCost(X, Y, 10, 20));
// This code is contributed by avanitrachhadiya2155
</script>
OutputMinimum Cost to make two strings identical is = 60
Time Complexity: O(m*n)
Auxiliary Space: O(m*n)
This article is reviewed by team geeksforgeeks.
Similar Reads
Minimum cost to make two strings same Given four integers a, b, c, d and two strings S1 and S2 of equal length, which consist only of the characters '2', '1' and '0'. Converting '1' to '2' or vice versa costs a.Converting '2' to '3' or vice versa costs b.Converting '3' to '1' or vice versa costs c.Deleting the ith character from both th
7 min read
Minimum cost to make two strings identical by deleting the digits Given two strings X and Y consisting of only digits '0' to '9'. Find minimum cost required to make the given two strings identical. Only operation allowed is to delete characters from any of the string. The cost of operation of deleting the digit 'd' is d units. Input: X = 3759, Y = 9350 Output: 23
15+ min read
Minimum changes to a string to make all substrings distinct Given a string, find minimum number of changes to it so that all substrings of the string become distinct. Examples : Input : str = "aab" Output : 1 If we change one instance of 'a' to any character from 'c' to 'z', we get all distinct substrings. Input : str = "aa" Output : 1Recommended PracticeMin
6 min read
Minimum days to achieve the String Given a string S of length N containing only lowercase alphabets, also given a permutation P of length N containing integers from 0 to N-1. In (i+1)th day you can take the P[i] value of the permutation array and replace S[P[i]] with a '?'. For example on day 1, we can choose the index of the permuta
15+ min read
Minimum move to end operations to make all strings equal Given n strings that are permutations of each other. We need to make all strings same with an operation that takes front character of any string and moves it to the end. Examples: Input: n = 2, arr[] = {"molzv", "lzvmo"}Output: 2Explanation: In first string, we remove first element("m") from first s
13 min read