Dada una array de strings arr[] que contiene patrones de caracteres y «*» que denota cualquier conjunto de caracteres, incluida la string vacía. La tarea es encontrar una string que coincida con todos los patrones de la array.
Nota: Si no existe tal patrón posible, imprima -1.
Ejemplos:
Entrada: arr[] = {“pq*du*q”, “pq*abc*q”, “p*d*q”}
Salida: pqduabcdq
Explicación:
el patrón “pqduabcdq” coincide con todas las strings:
String 1:
Primero “ *” se puede reemplazar por una string vacía.
El segundo «*» se puede reemplazar por «abcdq».
String 2:
El primer «*» se puede reemplazar por «du»
El segundo «*» se puede reemplazar por «d»
String 3:
El primer «*» se puede reemplazar por «q»
El segundo «*» se puede reemplazar por «uabcd»
Entrada: arr[] = {“a*c”, “*”}
Salida: ac
Enfoque: La idea es encontrar el prefijo común y la string de sufijos en todos los patrones y luego el medio de cada patrón puede ser reemplazado por el primero o el último «*» en cada patrón. A continuación se muestra la ilustración del enfoque:
- Cree tres strings vacías que coincidan con el prefijo, el sufijo y la parte central de cada patrón.
- Iterar sobre cada patrón en la array, para cada patrón:
- Encuentra el primer y último «*» en el patrón.
- Itere sobre el prefijo existente y verifique que si coincide con el prefijo actual del patrón, si algún carácter no coincide con el patrón, devuelva -1.
- Si queda alguna parte en el prefijo del patrón actual, agréguela al prefijo de la string común.
- Del mismo modo, haga coincidir el sufijo del patrón.
- Finalmente, agregue todos los caracteres del medio de la string excepto el «*» en la string inicializada del medio para la string común.
- Finalmente, concatene las partes de la string común que es el prefijo, el medio y la parte del sufijo de la string.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ implementation to find the // string which matches // all the patterns #include<bits/stdc++.h> using namespace std; // Function to find a common string // which matches all the pattern string find(vector<string> S,int N) { // For storing prefix till // first most * without conflicts string pref; // For storing suffix till // last most * without conflicts string suff; // For storing all middle // characters between // first and last * string mid; // Loop to iterate over every // pattern of the array for (int i = 0; i < N; i++) { // Index of the first "*" int first = int( S[i].find_first_of('*') ); // Index of Last "*" int last = int( S[i].find_last_of('*') ); // Iterate over the first "*" for (int z = 0; z < int(pref.size()) && z < first; z++) { if (pref[z] != S[i][z]) { return "*"; } } // Prefix till first most * // without conflicts for (int z = int(pref.size()); z < first; z++) { pref += S[i][z]; } // Iterate till last // most * from last for (int z = 0; z < int(suff.size()) && int(S[i].size())-1-z > last; z++) { if (suff[z] != S[i][int(S[i].size())-1-z]) { return "*"; } } // Make suffix till last // most * without conflicts for (int z = int(suff.size()); int(S[i].size())-1-z > last; z++) { suff += S[i][int(S[i].size())-1-z]; } // Take all middle characters // in between first and last most * for (int z = first; z <= last; z++) { if (S[i][z] != '*') mid += S[i][z]; } } reverse(suff.begin(), suff.end()); return pref + mid + suff; } // Driver Code int main() { int N = 3; vector<string> s(N); // Take all // the strings s[0]="pq*du*q"; s[1]="pq*abc*q"; s[2]="p*d*q"; // Method for finding // common string cout<<find(s,N); return 0; }
Python3
# Python3 implementation # to find the string which # matches all the patterns # Function to find a common # string which matches all # the pattern def find(S, N): # For storing prefix # till first most * # without conflicts pref = "" # For storing suffix # till last most * # without conflicts suff = "" # For storing all middle # characters between # first and last * mid = "" # Loop to iterate over every # pattern of the array for i in range(N): # Index of the first "*" first = int(S[i].index("*")) # Index of Last "*" last = int(S[i].rindex("*")) # Iterate over the first "*" for z in range(len(pref)): if(z < first): if(pref[z] != S[i][z]): return "*" # Prefix till first most * # without conflicts for z in range(len(pref),first): pref += S[i][z]; # Iterate till last # most * from last for z in range(len(suff)): if(len(S[i]) - 1 - z > last): if(suff[z] != S[i][len(S[i]) - 1 - z]): return "*" # Make suffix till last # most * without conflicts for z in range(len(suff), len(S[i]) - 1 - last): suff += S[i][len(S[i]) - 1 - z] # Take all middle characters # in between first and last most * for z in range(first, last + 1): if(S[i][z] != '*'): mid += S[i][z] suff=suff[:: -1] return pref + mid + suff # Driver Code N = 3 s = ["" for i in range(N)] # Take all # the strings s[0] = "pq*du*q" s[1] = "pq*abc*q" s[2] = "p*d*q" # Method for finding # common string print(find(s, N)) # This code is contributed by avanitrachhadiya2155
pqduabcdq
Publicación traducida automáticamente
Artículo escrito por grand_master y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA