Transform One String to Another using Minimum Number of Given Operation - GeeksforGeeks

02 May, 2022
Given two strings A and B, the task is to convert A to B if possible. The only operation allowed is to put any character from A and insert it at front. Find if it’s possible to convert the string. If yes, then output minimum no. of operations required for transformation.
Examples: 
Input:  A = "ABD", B = "BAD"
Output: 1
Explanation: Pick B and insert it at front.

Input:  A = "EACBD", B = "EABCD"
Output: 3
Explanation: Pick B and insert at front, EACBD => BEACD
             Pick A and insert at front, BEACD => ABECD
             Pick E and insert at front, ABECD => EABCD
Checking whether a string can be transformed to another is simple. We need to check whether both strings have same number of characters and same set of characters. This can be easily done by creating a count array for first string and checking if second string has same count of every character. How to find minimum number of operations when we are sure that we can transform A to B? The idea is to start matching from last characters of both strings. If last characters match, then our task reduces to n-1 characters. If last characters don’t match, then find the position of B’s mismatching character in A. The difference between two positions indicates that these many characters of A must be moved before current character of A. 
Below is complete algorithm. 1) Find if A can be transformed to B or not by first creating a count array for all characters of A, then checking with B if B has same count for every character. 2) Initialize result as 0. 3) Start traversing from end of both strings. ......a) If current characters of A and B match, i.e., A[i] == B[j] .........then do i = i-1 and j = j-1     b) If current characters don’t match, then search B[j] in remaining .........A. While searching, keep incrementing result as these characters .........must be moved ahead for A to B transformation.
Below are the implementations based on this idea.  
C++
C
Java
Python3
C#
PHP
Javascript
// C++ program to find minimum number of operations required// to transform one string to other#include <bits/stdc++.h>using namespace std; // Function to find minimum number of operations required to// transform A to B.int minOps(string& A, string& B){    int m = A.length(), n = B.length();     // This parts checks whether conversion is possible or not    if (n != m)        return -1;    int count[256];    memset(count, 0, sizeof(count));    // count characters in A    for (int i = 0; i < n; i++)        count[A[i]]++;    // subtract count for every character in B    for (int i = 0; i < n; i++)        count[B[i]]--;    // Check if all counts become 0    for (int i = 0; i < 256; i++)        if (count[i])            return -1;     // This part calculates the number of operations    // required    int res = 0;    for (int i = n - 1, j = n - 1; i >= 0;) {        // If there is a mismatch, then keep incrementing        // result 'res' until B[j] is not found in A[0..i]        while (i >= 0 && A[i] != B[j]) {            i--;            res++;        }        // If A[i] and B[j] match        if (i >= 0) {            i--;            j--;        }    }    return res;} // Driver programint main(){    string A = "EACBD";    string B = "EABCD";    cout << "Minimum number of operations required is " << minOps(A, B);    return 0;} // This code is contributed by Aditya Kumar (adityakumar129)
// C program to find minimum number of operations required// to transform one string to other#include <stdio.h>#include <string.h> // Function to find minimum number of operations required to// transform A to B.int minOps(char A[], char B[]){    int m = strlen(A), n = strlen(B);     // This parts checks whether conversion is    // possible or not    if (n != m)        return -1;    int count[256];    for (int i = 0; i < 256; i++)        count[i] = 0;    // count characters in A    for (int i = 0; i < n; i++)        count[A[i]]++;    // subtract count for every character in B    for (int i = 0; i < n; i++)        count[B[i]]--;    // Check if all counts become 0    for (int i = 0; i < 256; i++)        if (count[i])            return -1;     // This part calculates the number of operations    // required    int res = 0;    for (int i = n - 1, j = n - 1; i >= 0;) {        // If there is a mismatch, then keep incrementing        // result 'res' until B[j] is not found in A[0..i]        while (i >= 0 && A[i] != B[j]) {            i--;            res++;        }        // If A[i] and B[j] match        if (i >= 0) {            i--;            j--;        }    }    return res;} // Driver programint main(){    char A[] = "EACBD";    char B[] = "EABCD";    printf("Minimum number of operations required is %d", minOps(A, B));    return 0;} // This code is contributed by Aditya Kumar (adityakumar129)
// Java program to find minimum number of operations// required to transform one string to otherimport java.io.*;import java.util.*; public class GFG {     // Function to find minimum number of operations    // required to transform A to B.    public static int minOps(String A, String B)    {         // This parts checks whether conversion is possible        // or not        if (A.length() != B.length())            return -1;         int i, j, res = 0;        int count[] = new int[256];         // count characters in A        // subtract count for every character in B        for (i = 0; i < A.length(); i++) {            count[A.charAt(i)]++;            count[B.charAt(i)]--;        }         // Check if all counts become 0        for (i = 0; i < 256; i++)            if (count[i] != 0)                return -1;         i = A.length() - 1;        j = B.length() - 1;         while (i >= 0) {            // If there is a mismatch, then keep            // incrementing result 'res' until B[j] is not            // found in A[0..i]            if (A.charAt(i) != B.charAt(j))                res++;            else                j--;            i--;        }        return res;    }     // Driver code    public static void main(String[] args)    {        String A = "EACBD";        String B = "EABCD";         System.out.println(            "Minimum number of operations required is "            + minOps(A, B));    }} // This code is contributed by Aditya Kumar (adityakumar129)
# Python program to find the minimum number of# operations required to transform one string to other # Function to find minimum number of operations required# to transform A to Bdef minOps(A, B):    m = len(A)    n = len(B)     # This part checks whether conversion is possible or not    if n != m:        return -1     count = [0] * 256     for i in range(n):        # count characters in A        count[ord(B[i])] += 1    for i in range(n):        # subtract count for every char in B        count[ord(A[i])] -= 1    for i in range(256):    # Check if all counts become 0        if count[i]:            return -1     # This part calculates the number of operations required    res = 0    i = n-1    j = n-1       while i >= 0:             # if there is a mismatch, then keep incrementing        # result 'res' until B[j] is not found in A[0..i]        while i>= 0 and A[i] != B[j]:            i -= 1            res += 1         # if A[i] and B[j] match        if i >= 0:            i -= 1            j -= 1     return res # Driver programA = "EACBD"B = "EABCD"print ("Minimum number of operations required is " + str(minOps(A,B)))# This code is contributed by Bhavya Jain
// C# program to find minimum number of// operations required to transform one// string to otherusing System; class GFG{ // Function to find minimum number of// operations required to transform// A to B.public static int minOps(string A, string B){     // This parts checks whether    // conversion is possible or not    if (A.Length != B.Length)    {        return -1;    }     int i, j, res = 0;    int[] count = new int [256];     // count characters in A     // subtract count for every    // character in B    for (i = 0; i < A.Length; i++)    {        count[A[i]]++;        count[B[i]]--;    }     // Check if all counts become 0    for (i = 0; i < 256; i++)    {        if (count[i] != 0)        {            return -1;        }    }     i = A.Length - 1;    j = B.Length - 1;     while (i >= 0)    {        // If there is a mismatch, then        // keep incrementing result 'res'        // until B[j] is not found in A[0..i]        if (A[i] != B[j])        {            res++;        }        else        {            j--;        }        i--;    }    return res;} // Driver codepublic static void Main(string[] args){    string A = "EACBD";    string B = "EABCD";     Console.WriteLine("Minimum number of " +                      "operations required is " +                       minOps(A, B));}} // This code is contributed by Shrikant13
<?php// PHP program to find minimum number of// operations required to transform one string to other  // Function to find minimum number of operations required to transform// A to B.function minOps($A, $B){    $m = strlen($A);    $n = strlen($B);       // This parts checks whether conversion is     // possible or not    if ($n != $m)       return -1;    $count = array_fill(0,256,NULL);    for ($i=0; $i<$n; $i++)   // count characters in A       $count[ord($B[$i])]++;    for ($i=0; $i<$n; $i++)   // subtract count for       $count[ord($A[$i])]--;         // every character in B    for ($i=0; $i<256; $i++)   // Check if all counts become 0      if ($count[$i])         return -1;      // This part calculates the number of operations required    $res = 0;    for ($i=$n-1, $j=$n-1; $i>=0; )    {        // If there is a mismatch, then keep incrementing        // result 'res' until B[j] is not found in A[0..i]        while ($i>=0 && $A[$i] != $B[$j])        {            $i--;            $res++;        }          // If A[i] and B[j] match        if ($i >= 0)        {            $i--;            $j--;        }    }    return $res;}  // Driver program $A = "EACBD";$B = "EABCD";echo "Minimum number of operations ".            "required is ". minOps($A, $B);return 0;?>
<script> // Javascript program to find minimum number// of operations required to transform one// string to other // Function to find minimum number of// operations required to transform// A to B.function minOps(A, B){         // This parts checks whether conversion    // is possible or not    if (A.length != B.length)        return -1;           let i, j, res = 0;    let count = new Array(256);         for(let i = 0; i < 256; i++)    {        count[i] = 0;    }           // count characters in A           // Subtract count for every character in B    for(i = 0; i < A.length; i++)    {        count[A[i].charCodeAt(0)]++;        count[B[i].charCodeAt(0)]--;    }           // Check if all counts become 0    for(i = 0; i < 256; i++)        if (count[i] != 0)            return -1;           i = A.length - 1;    j = B.length - 1;     while(i >= 0)    {                 // If there is a mismatch, then        // keep incrementing result 'res'        // until B[j] is not found in A[0..i]        if (A[i] != B[j])            res++;        else            j--;                     i--;            }    return res;    } // Driver codelet A = "EACBD";let B = "EABCD"; document.write("Minimum number of " +               "operations required is " +               minOps(A, B)); // This code is contributed by avanitrachhadiya2155 </script>
Output: 
Minimum number of operations required is 3
Time Complexity: O(n), please note that i is always decremented (in while loop and in if), and the for loop starts from n-1 and runs while i >= 0.
Thanks to Gaurav Ahirwar for above solution.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above 
dipesh_jain
shrikanth13
ukasp
avanitrachhadiya2155
vaishnavichouhan25
amartyaghoshgfg
adityakumar129
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Check for Balanced Brackets in an expression (well-formedness) using Stack
Python program to check if a string is palindrome or not
KMP Algorithm for Pattern Searching
Different methods to reverse a string in C/C++
Array of Strings in C++ (5 Different Ways to Create)
Convert string to char array in C++
Longest Palindromic Substring | Set 1
Caesar Cipher in Cryptography
Check whether two strings are anagram of each other
Top 50 String Coding Problems for Interviews