Número mínimo de subsecuencias necesarias para convertir una string en otra

Dadas dos strings A y B que consisten solo en letras minúsculas, la tarea es encontrar el número mínimo de subsecuencias requeridas de A para formar B.

Ejemplos: 

Entrada: A = “abbace” B = “acebbaae” 
Salida:
Explicación: 
Subsecuencias “ace”, “bba”, “ae” de la string A usadas para formar la string B

Entrada: A = “abc” B = “cbacbacba” 
Salida:
 

Acercarse:  

  • Mantenga una array para cada carácter de A que almacenará sus índices en orden creciente.
  • Atraviese cada elemento de B y aumente el contador cada vez que se necesite una nueva subsecuencia.
  • Mantenga una variable minIndex que mostrará que los elementos mayores que este índice se pueden tomar en la subsecuencia actual; de lo contrario, aumente el contador y actualice minIndex a -1.

A continuación se muestra la implementación del enfoque anterior. 

C++

// C++ program to find the Minimum number
// of subsequences required to convert
// one string to another
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the no of subsequences
int minSubsequnces(string A, string B)
{
    vector<int> v[26];
    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
Producción: 

3

 

Publicación traducida automáticamente

Artículo escrito por AmanGupta65 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *