Minimum number of subsequences required to convert one string to another

• Last Updated : 07 Aug, 2021

Given two strings A and B consisting of only lowercase letters, the task is to find the minimum number of subsequences required from A to form B.

Examples:

Input: A = “abbace” B = “acebbaae”
Output:
Explanation:
Sub-sequences “ace”, “bba”, “ae” from string A used to form string B

Input: A = “abc” B = “cbacbacba”
Output:

Approach:

• Maintain an array for each character of A which will store its indexes in increasing order.
• Traverse through each element of B and increase the counter whenever there is a need for new subsequence.
• Maintain a variable minIndex which will show that elements greater than this index can be taken in current subsequence otherwise increase the counter and update the minIndex to -1.

Below is the implementation of the above approach.

C++

 // C++ program to find the Minimum number// of subsequences required to convert// one string to another #include using namespace std; // Function to find the no of subsequencesint minSubsequnces(string A, string B){    vector v;    int minIndex = -1, cnt = 1, j = 0;    int flag = 0;     for (int i = 0; i < A.length(); i++) {         // Push the values of indexes of each character        int p = (int)A[i] - 97;        v[p].push_back(i);    }     while (j < B.length()) {        int p = (int)B[j] - 97;         // Find the next index available in the array        int k = upper_bound(v[p].begin(),                            v[p].end(), minIndex)                - v[p].begin();         // If Character is not in string A        if (v[p].size() == 0) {            flag = 1;            break;        }         // Check if the next index is not equal to the        // size of array which means there is no index        // greater than minIndex in the array        if (k != v[p].size()) {             // Update value of minIndex with this index            minIndex = v[p][k];            j = j + 1;        }        else {             // Update the value of counter            // and minIndex for next operation            cnt = cnt + 1;            minIndex = -1;        }    }    if (flag == 1) {        return -1;    }    return cnt;} // Driver Codeint main(){    string A1 = "abbace";    string B1 = "acebbaae";    cout << minSubsequnces(A1, B1) << endl;    return 0;}

Python3

 # Python3 program to find the Minimum number# of subsequences required to convert# one to anotherfrom bisect import bisect as upper_bound # Function to find the no of subsequencesdef minSubsequnces(A, B):    v = [[] for i in range(26)]    minIndex = -1    cnt = 1    j = 0    flag = 0     for i in range(len(A)):         # Push the values of indexes of each character        p = ord(A[i]) - 97        v[p].append(i)     while (j < len(B)):        p = ord(B[j]) - 97         # Find the next index available in the array        k = upper_bound(v[p], minIndex)         # If Character is not in A        if (len(v[p]) == 0):            flag = 1            break         # Check if the next index is not equal to the        # size of array which means there is no index        # greater than minIndex in the array        if (k != len(v[p])):             # Update value of minIndex with this index            minIndex = v[p][k]            j = j + 1        else:             # Update the value of counter            # and minIndex for next operation            cnt = cnt + 1            minIndex = -1    if (flag == 1):        return -1    return cnt # Driver CodeA1 = "abbace"B1 = "acebbaae"print(minSubsequnces(A1, B1)) # This code is contributed by mohit kumar 29
Output:
3

My Personal Notes arrow_drop_up