 Open in App
Not now

# Minimum number of subsequences required to convert one string to another

• Last Updated : 29 Aug, 2022

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 subsequences``int` `minSubsequnces(string A, string B)``{``    ``vector<``int``> 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 Code``int` `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 another``from` `bisect ``import` `bisect as upper_bound` `# Function to find the no of subsequences``def` `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 Code``A1 ``=` `"abbace"``B1 ``=` `"acebbaae"``print``(minSubsequnces(A1, B1))` `# This code is contributed by mohit kumar 29`

Output:

`3`

Time Complexity: O(N1+N2) // N1 is the length of string A and N2 is the length of string B

Auxiliary Space: O(26)

My Personal Notes arrow_drop_up