Home » Technical Interview Questions » String Interview Questions » Transform one string to another using minimum number of given operations

# Transform one string to another using minimum number of given operations

## Given two strings s1 and s2, write a function that will convert s1 to s2(if possible) by using only one opeartion.

The operation is to pick any character from s1 and insert it at front of s1. Print the number of operations that took to convert.

### Example

INPUT
s1 = “abcd”

OUTPUT
2
The number of opeartions took are 2

### Explanation

Pick ‘b’ and insert it at beginning ie, “abcd” -> “bacd”
Pick ‘c’ and insert it at beginning ie, “bacd” -> “cbad”

## Algorithm

1. First create two count arrays for s1 and s2, to check whether s1 can be converted to s2 or not

2. Traverse from end of both strings, ie, i = n-1 for s1 and j = n-1 for s2. Initialize count to keep track of no of operations

a. If characters match, ie s1[i] == s2[j],  then make i = i-1 and j = j-1
b. If current characters dont match, then search s2[j] in remaining s1, Keep increamenting     count as these characters must be moved ahead.

For above example, step 2 will be as follows

1) s1[i](ie, ‘d’) = s2[j](ie, ‘d’), decreament i,j

2) s1[i](ie, c) != s2[j](ie, ‘a’), decreament i and increase count, ie count = 1

3) s1[i](ie, ‘b’) != s2[j](ie, ‘a’), decreament i and increase count, count = 2

4) s1[i](ie, ‘a’) = s2[j](ie, ‘a’)

Therefore, count = 2

## C++ Program

```#include<bits/stdc++.h>
#define NO_OF_CHARS 256
using namespace std;

// Function to find minimum number of operations required to transform
// s1 to s2.
int minOps(string& s1, string& s2)
{
int m = s1.length(), n = s2.length();

//1) checking whether the conversion is possible or not
if (n != m)
{
return -1;
}
int count[NO_OF_CHARS];
//initializing 0 to every char in count.
memset(count, 0, sizeof(count));
// count characters in s1
for (int i=0; i<n; i++)
{
count[s2[i]]++;
}
// subtract count for every character in s2
for (int i=0; i<n; i++)
{
count[s1[i]]--;
}
// Check if all counts become 0, if yes we are good
for (int i=0; i<256; i++)
{
if (count[i])
return -1;
}

//2) calculating the number of operations required
int ans = 0;
for (int i=n-1, j=n-1; i>=0; )
{
// If there is a mismatch, then keep incrementing
while (i>=0 && s1[i] != s2[j])
{
i--;
ans++;
}

// If s1[i] and s2[j] match
if (i >= 0)
{
i--;
j--;
}
}
return ans;
}

// Driver program
int main()
{
string s1 = "abcde";