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: 3
Explicación:
Subsecuencias “ace”, “bba”, “ae” de la string A usadas para formar la string BEntrada: A = “abc” B = “cbacbacba”
Salida: 7
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