Cuente distintos correos electrónicos presentes en una array dada

Dada una array arr[] que consta de N strings donde cada string representa una dirección de correo electrónico que consta de alfabetos ingleses, ‘.’, ‘+’ y ‘@’ , la tarea es contar la cantidad de correos electrónicos distintos presentes en la array de acuerdo con las siguientes reglas:

  • Una dirección de correo electrónico se puede dividir en dos substrings, el prefijo y el sufijo de ‘@’ , que son el nombre local y el nombre de dominio, respectivamente.
  • El ‘.’ se ignora el carácter de la string en el nombre local.
  • En el nombre local, se ignoran todos los caracteres después de ‘ + ‘.

Ejemplos:

Entrada: arr[] = {“raghav.agg@geeksforgeeks.com”, “raghavagg@geeksforgeeks.com”}
Salida: 1
Explicación: Eliminar todos los ‘.’ antes de ‘@’ modifica las strings a {“raghavagg@geeksforgeeks.com”} .com”, “raghavagg@geeksforgeeks.com”}. Por lo tanto, el número total de correos electrónicos distintos presentes en la string es 1.

Entrada: arr[] = {“avruty+dhir+gfg@geeksforgeeks.com”, “avruty+gfg@geeksforgeeks.com”, “av.ruty@geeksforgeeks.com”}
Salida: 1

Enfoque: el problema dado se puede resolver almacenando cada correo electrónico en un HashSet después de completarlo de acuerdo con la regla dada e imprimir el tamaño del HashSet obtenido. Siga los pasos a continuación para resolver el problema:

  • Inicialice un HashSet , digamos S , para almacenar todas las strings distintas después de completar de acuerdo con las reglas dadas.
  • Recorra la array dada arr[] y realice los siguientes pasos:
    • Encuentre la posición de ‘@’ y guárdela en una variable, digamos pos2 .
    • Eliminar todos los ‘.’ caracteres antes de pos2 usando la función erase() .
    • Actualice la posición de ‘@’ , es decir, pos2 = find(‘@’) y encuentre la posición de ‘+’ y guárdela en una variable, digamos pos1 como S.find(‘+’) .
    • Ahora, borre todos los caracteres después de pos1 y antes de pos2 .
    • Inserte todas las strings actualizadas en un HashSet S.
  • Después de completar los pasos anteriores, imprima el tamaño de HashSet S como resultado.

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

C++14

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to count all the distinct
// emails after preprocessing according
// to the given rules
int distinctEmails(vector<string>& emails)
{
    // Traverse the given array of
    // strings arr[]
    for (auto& x : emails) {
 
        // Stores the position of '@'
        // in the string
        auto pos2 = x.find('@');
 
        // If pos2 < x.size()
        if (pos2 < x.size())
 
            // Erases all the occurrences
            // of '.' before pos2
            x.erase(
                remove(x.begin(),
                    x.begin() + pos2, '.'),
                x.begin() + pos2);
 
        // Stores the position of the
        // first '+'
        auto pos1 = x.find('+');
 
        // Update the position pos2
        pos2 = x.find('@');
 
        // If '+' exists then erase
        // characters after '+' and
        // before '@'
        if (pos1 < x.size()
            and pos2 < x.size()) {
            x.erase(pos1, pos2 - pos1);
        }
    }
 
    // Insert all the updated strings
    // inside the set
    unordered_set<string> ans(
        emails.begin(),
        emails.end());
 
    // Return the size of set ans
    return ans.size();
}
 
// Driver Code
int main()
{
    vector<string> arr
        = { "raghav.agg@geeksforgeeks.com",
            "raghavagg@geeksforgeeks.com" };
 
    // Function Call
    cout << distinctEmails(arr);
 
    return 0;
}

Python3

# Python3 program for the above approach
 
# Function to count all the distinct
# emails after preprocessing according
# to the given rules
def distinctEmails(emails):
   
  ans = set([])
 
  # Traverse the given array of
  # strings arr[]
  for x in emails:
 
    # Stores the position of '@'
    # in the string
    pos2 = x.find('@')
 
    # If pos2 < x.size()
    if (pos2 < len(x)):
 
      # Erases all the occurrences
      # of '.' before pos2
      p = x[:pos2]
      p = p.replace(".", "")
      x = p + x[pos2:]
 
      # Stores the position of the
      # first '+'
      pos1 = x.find('+')
 
      # Update the position pos2
      pos2 = x.find('@')
 
      # If '+' exists then erase
      # characters after '+' and
      # before '@'
      if (pos1 > 0 and pos1 < len(x) and
          pos2 < len(x)):
        x = x[:pos1] + x[pos2:]
 
      # Insert all the updated strings
      # inside the set
      ans.add(x)
 
  # Return the size of set ans
  return len(ans)
 
# Driver Code
if __name__ == "__main__":
 
    arr = ["raghav.agg@geeksforgeeks.com",
           "raghavagg@geeksforgeeks.com"]
 
    # Function Call
    print(distinctEmails(arr))
 
# This code is contributed by ukasp
Producción: 

1

 

Tiempo Complejidad: O(N 2 )
Espacio Auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por piyushagg 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 *