Dadas dos strings S1 y S2 , la tarea es comprobar si es posible generar la string S2 agregando repetidamente subsecuencias de S1 al final de una string inicialmente vacía. Si es posible, escriba “ SI ” y el número mínimo de operaciones requeridas. De lo contrario, escriba “ NO ”.
Ejemplos:
Entrada: S1 = “acebcd”, S2 = “acbcd”
Salida:
SÍ
2
Explicación: Agregue la subsecuencia “acbc” seguida de “d” para obtener S2.Entrada: S1 = “aceasd”, S2 = “asdxds”
Salida: NO
Explicación: Dado que el carácter ‘x’ no está presente en S1, no se puede obtener S2.
Enfoque: siga los pasos a continuación para resolver el problema:
- Itere sobre los caracteres de la string S1 y almacene las frecuencias de cada carácter en S1 en una array freq[] .
- Atraviese la string S2 y verifique si hay algún carácter en S2 que no esté presente en S1 . Si se encuentra alguno de estos caracteres, escriba “NO”.
- De lo contrario, itere sobre los caracteres en S1 y actualice los índices de cada carácter en un Conjunto
- Recorra la string S2 y para cada carácter, verifique si se puede incluir en la subsecuencia actual de S1 que se puede agregar.
- Si se determina que es cierto, establezca el índice del carácter actual como el del último carácter agregado. De lo contrario, aumente el número de subsecuencias y establezca el índice del carácter actual como el del último carácter añadido. Continúe con el siguiente carácter.
- finalmente, imprima “ SI ” y el conteo de tales subsecuencias como respuesta requerida.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ Program to implement // the above approach #include "bits/stdc++.h" using namespace std; // Function for finding minimum // number of operations int findMinimumOperations(string s, string s1) { // Stores the length of strings int n = s.length(), m = s1.length(); // Stores frequency of // characters in string s int frequency[26] = { 0 }; // Update frequencies of // character in s for (int i = 0; i < n; i++) frequency[s[i] - 'a']++; // Traverse string s1 for (int i = 0; i < m; i++) { // If any character in s1 // is not present in s if (frequency[s1[i] - 'a'] == 0) { return -1; } } // Stores the indices of // each character in s set<int> indices[26]; // Traverse string s for (int i = 0; i < n; i++) { // Store indices of characters indices[s[i] - 'a'].insert(i); } int ans = 1; // Stores index of last // appended character int last = (*indices[s1[0] - 'a'] .begin()); // Traverse string s1 for (int i = 1; i < m; i++) { int ch = s1[i] - 'a'; // Find the index of next // character that can be appended auto it = indices[ch].upper_bound( last); // Check if the current // character be included // in the current subsequence if (it != indices[ch].end()) { last = (*it); } // Otherwise else { // Start a new subsequence ans++; // Update index of last // character appended last = (*indices[ch].begin()); } } return ans; } // Driver Code int main() { string S1 = "acebcd", S2 = "acbcde"; int ans = findMinimumOperations( S1, S2); // If S2 cannot be obtained // from subsequences of S1 if (ans == -1) { cout << "NO\n"; } // Otherwise else { cout << "YES\n" << ans; } return 0; }
Python3
# Python3 Program to implement # the above approach from bisect import bisect ,bisect_left,bisect_right # Function for finding minimum # number of operations def findMinimumOperations(s,s1): #Stores the length of strings n = len(s) m = len(s1) # Stores frequency of # characters in string s frequency = [0]*26 # Update frequencies of # character in s for i in range(n): frequency[ord(s[i]) - ord('a')] += 1 # Traverse string s1 for i in range(m): # If any character in s1 # is not present in s if (frequency[ord(s1[i]) - ord('a')] == 0): return -1 # Stores the indices of # each character in s indices = [[] for i in range(26)] # Traverse string s for i in range(n): # Store indices of characters indices[ord(s[i]) - ord('a')].append(i) ans = 2 # Stores index of last # appended character last =len(indices[ord(s1[0])- ord('a')]) - 1 # Traverse string s1 for i in range(1,m): ch = ord(s1[i]) - ord('a') # Find the index of next # character that can be appended it = bisect_right(indices[ch],last) # print(it) # Check if the current # character be included # in the current subsequence if (it != len(indices[ch])): last = it # Otherwise else: # Start a new subsequence ans += 1 # Update index of last # character appended last = len(indices[ch]) return ans # Driver Code if __name__ == '__main__': S1 = "acebcd" S2 = "acbcde" ans = findMinimumOperations(S1, S2) # If S2 cannot be obtained # from subsequences of S1 if (ans == -1): print("NO") # Otherwise else: print("YES") print(ans) # This code is contributed by mohit kumar 29
YES 2
Complejidad temporal: O(Mlog(N))
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por reapedjuggler y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA