Minimum cost to convert str1 to str2 with the given operations

Given two strings of equal lengths str1 and str2 consisting of characters ‘a’ and ‘b’ only. The followig operations can be performed on str1:

  1. Any character can be changed from ‘a’ to ‘b’ or from ‘b’ to ‘a’ with 1 unit cost.
  2. 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
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 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 compares 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++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the minimum
// cost to convert str1 to sr2
int minCost(string str1, string str2, int n)
{
    int cost = 0;
  
    // For every character of str1
    for (int i = 0; i < n; i++) {
  
        // If current character is not
        // equal in both the strings
        if (str1[i] != str2[i]) {
  
            // If the next character is also different in both
            // the strings then these characters can be swapped
            if (i < n - 1 && str1[i + 1] != str2[i + 1]) {
                swap(str1[i], str1[i + 1]);
                cost++;
            }
  
            // Change the current character
            else {
                cost++;
            }
        }
    }
    return cost;
}
  
// Driver code
int main()
{
    string str1 = "abb", str2 = "bba";
    int n = str1.length();
  
    cout << minCost(str1, str2, n);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of the approach
import java.util.*;
  
class GFG 
{
  
// Function to return the minimum
// cost to convert str1 to sr2
static int minCost(char []str1, 
                   char []str2, int n)
{
    int cost = 0;
  
    // For every character of str1
    for (int i = 0; i < n; i++) 
    {
  
        // If current character is not
        // equal in both the strings
        if (str1[i] != str2[i])
        {
  
            // If the next character is also different in both
            // the strings then these characters can be swapped
            if (i < n - 1 && str1[i + 1] != str2[i + 1]) 
            {
                swap(str1, i, i + 1);
                cost++;
            }
  
            // Change the current character
            else 
            {
                cost++;
            }
        }
    }
    return cost;
}
  
static void swap(char []arr, int i, int j)
{
    char temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}
  
// Driver code
public static void main(String[] args)
{
    String str1 = "abb", str2 = "bba";
    int n = str1.length();
  
    System.out.println(minCost(str1.toCharArray(), 
                               str2.toCharArray(), n));
}
}
  
// This code is contributed by Rajput-Ji

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach 
  
# Function to return the minimum 
# cost to convert str1 to sr2 
def minCost(str1, str2, n): 
  
    cost = 0
  
    # For every character of str1
    for i in range(n): 
  
        # If current character is not 
        # equal in both the strings 
        if (str1[i] != str2[i]): 
  
            # If the next character is also different in both 
            # the strings then these characters can be swapped 
            if (i < n - 1 and str1[i + 1] != str2[i + 1]): 
                swap(str1[i], str1[i + 1]) 
                cost += 1
              
            # Change the current character 
            else
                cost += 1
              
    return cost 
  
# Driver code 
if __name__ == '__main__'
  
    str1 = "abb"
    str2 = "bba"
    n = len(str1) 
  
    print(minCost(str1, str2, n)) 
  
# This code is contributed by ashutosh450

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach 
using System;
  
class GFG
{
      
    // Function to return the minimum 
    // cost to convert str1 to sr2 
    static int minCost(string str1, 
                       string str2, int n) 
    
        int cost = 0; 
      
        char[] array = str1.ToCharArray();
          
        // For every character of str1 
        for (int i = 0; i < n; i++) 
        
      
            // If current character is not 
            // equal in both the strings 
            if (str1[i] != str2[i]) 
            
      
                // If the next character is also different in both 
                // the strings then these characters can be swapped 
                if (i < n - 1 && str1[i + 1] != str2[i + 1])
                
                    char temp = array[i];
                    array[i] = array[i + 1];
                    array[i + 1] = temp ;
                      
                    cost++; 
                
      
                // Change the current character 
                else
                
                    cost++; 
                
            
        
        return cost; 
    
      
    // Driver code 
    static public void Main () 
    
        string str1 = "abb", str2 = "bba"
        int n = str1.Length; 
      
        Console.WriteLine(minCost(str1, str2, n)); 
    
}
  
// This code is contributed by AnkitRai01

chevron_right


Output:

2


My Personal Notes arrow_drop_up


If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.