Minimum cost to convert str1 to str2 with the given operations
Last Updated :
24 Apr, 2023
Given two strings of equal lengths str1 and str2 consist of characters ‘a’ and ‘b’ only. The following operations can be performed on str1:
- Any character can be changed from ‘a’ to ‘b’ or from ‘b’ to ‘a’ with 1 unit cost.
- Any two characters str1[i] and str1[j] can be swapped with cost |i – j|.
The task is to find the minimum cost required to convert str1 to str2.
Examples:
Input: str1 = “abb”, str2 = “baa”
Output: 2
Explanation: Swap(str1[0], str1[1]), str1 = “bab” and cost = 1
Change str1[2] = ‘b’ to ‘a’, str1 = “baa” and cost = 2
Input: str1 = “abab”, str2 = “aabb”
Output: 1
Approach: It can be observed that swapping will only be performed on consecutive characters because if the characters are not consecutive then the cost of swapping will be ? 2 which will give a cost greater than or equal to the cost of changing those characters using the operation of the first type. Now, for every two consecutive characters if they are different in both the string then swap these characters incurring 1 unit cost as compared to 2 unit cost when both of them are changed separately. Else change the character which is different in both the strings (either the current or the next). Finally, print the calculated cost.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int minCost(string str1, string str2, int n)
{
int cost = 0;
for ( int i = 0; i < n; i++) {
if (str1[i] != str2[i]) {
if (i < n - 1 && str1[i + 1] != str2[i + 1]) {
swap(str1[i], str1[i + 1]);
cost++;
}
else {
cost++;
}
}
}
return cost;
}
int main()
{
string str1 = "abb" , str2 = "bba" ;
int n = str1.length();
cout << minCost(str1, str2, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int minCost( char []str1,
char []str2, int n)
{
int cost = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (str1[i] != str2[i])
{
if (i < n - 1 && str1[i + 1 ] != str2[i + 1 ])
{
swap(str1, i, i + 1 );
cost++;
}
else
{
cost++;
}
}
}
return cost;
}
static void swap( char []arr, int i, int j)
{
char temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args)
{
String str1 = "abb" , str2 = "bba" ;
int n = str1.length();
System.out.println(minCost(str1.toCharArray(),
str2.toCharArray(), n));
}
}
|
Python3
def minCost(str1, str2, n):
cost = 0
for i in range (n):
if (str1[i] ! = str2[i]):
if (i < n - 1 and str1[i + 1 ] ! = str2[i + 1 ]):
swap(str1[i], str1[i + 1 ])
cost + = 1
else :
cost + = 1
return cost
if __name__ = = '__main__' :
str1 = "abb"
str2 = "bba"
n = len (str1)
print (minCost(str1, str2, n))
|
C#
using System;
class GFG
{
static int minCost( string str1,
string str2, int n)
{
int cost = 0;
char [] array = str1.ToCharArray();
for ( int i = 0; i < n; i++)
{
if (str1[i] != str2[i])
{
if (i < n - 1 && str1[i + 1] != str2[i + 1])
{
char temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp ;
cost++;
}
else
{
cost++;
}
}
}
return cost;
}
static public void Main ()
{
string str1 = "abb" , str2 = "bba" ;
int n = str1.Length;
Console.WriteLine(minCost(str1, str2, n));
}
}
|
Javascript
<script>
function minCost(str1, str2, n)
{
let cost = 0;
let array = str1.split( '' );
for (let i = 0; i < n; i++)
{
if (str1[i] != str2[i])
{
if (i < n - 1 && str1[i + 1] != str2[i + 1])
{
let temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp ;
cost++;
}
else
{
cost++;
}
}
}
return cost;
}
let str1 = "abb" , str2 = "bba" ;
let n = str1.length;
document.write(minCost(str1, str2, n));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...