Encuentre una string que coincida con todos los patrones en la array dada

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
Producción: 

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

Deja una respuesta

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