Recuento de anagramas de cada string en una array presente en otra array

Dadas dos arrays arr1[] y arr2[] que consisten en strings, la tarea es imprimir el recuento de anagramas de cada string en arr2[] que están presentes en arr1[].

Ejemplos: 

Entrada: arr1[] = [“geeks”, “aprender”, “para”, “egeks”, “ealrn”], arr2[] = [“kgees”, “rof”, “nrael”] 
Salida: 2 1 2 
Explicación: 
Anagramas de arr2[0] (“kgees”) en arr1 : “geeks” y “egeks”. 
Anagramas de arr2[1] (“rof”) en arr1 : “para”. 
Anagramas de arr2[2] (“nrael”) en arr1 : “aprender” y “ealrn”.

Entrada: arr1[] = [“code”, “to”, “grow”, “odce”], arr2[] = [“edoc”, “wgor”, “ot”] 
Salida: 2 1 1 
Explicación: 
Anagramas de arr2[0] (“edoc”) en arr1 “código” y “odce”. 
Anagramas de arr2[1] (“wgor”) en arr1 “crecer”. 
Anagramas de arr2[2] (“ot”) en arr1 “to” 

Enfoque: 
Para resolver el problema, la idea es utilizar el conteo de frecuencias con la ayuda de HashMap . Almacene las frecuencias de cada string en arr1[] en hashmap en su forma ordenada. Atraviese arr2[], ordene strings en arr2[] e imprima sus respectivas frecuencias en HashMap.

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

C++

// C++ Program to count the
// number of anagrams of
// each string in a given
// array present in
// another array
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the
// count of anagrams
void count(string arr1[],
           string arr2[],
           int n, int m)
{
    // Store the frequencies
    // of strings in arr1[]
    unordered_map<string, int> freq;
 
    for (int i = 0; i < n; i++) {
 
        // Sort the string
        sort(arr1[i].begin(),
             arr1[i].end());
 
        // Increase its frequency
        // in the map
        freq[arr1[i]]++;
    }
 
    for (int i = 0; i < m; i++) {
 
        // Sort the string
        sort(arr2[i].begin(),
             arr2[i].end());
 
        // Display its anagrams
        // in arr1[]
        cout << freq[arr2[i]]
             << " ";
    }
}
 
// Driver Code
int main()
{
 
    string arr1[] = { "geeks", "learn",
                      "for", "egeks",
                      "ealrn" };
    int n = sizeof(arr1)
            / sizeof(string);
 
    string arr2[] = { "kgees", "rof",
                      "nrael" };
    int m = sizeof(arr2)
            / sizeof(string);
 
    count(arr1, arr2, n, m);
}

Java

// Java program to count the number
// of anagrams of each String in a
// given array present in
// another array
import java.util.*;
 
class GFG{
 
static String sortString(String inputString)
{
     
    // Convert input string to char array
    char tempArray[] = inputString.toCharArray();
       
    // Sort tempArray
    Arrays.sort(tempArray);
       
    // Return new sorted string
    return new String(tempArray);
}
 
// Function to return the
// count of anagrams
static void count(String arr1[],
                  String arr2[],
                  int n, int m)
{
     
    // Store the frequencies
    // of Strings in arr1[]
    HashMap<String, Integer> freq = new HashMap<>();
 
    for(int i = 0; i < n; i++)
    {
         
        // Sort the String
        arr1[i] = sortString(arr1[i]);
         
        // Increase its frequency
        // in the map
        if (freq.containsKey(arr1[i]))
        {
            freq.put(arr1[i],
            freq.get(arr1[i]) + 1);
        }
        else
        {
            freq.put(arr1[i], 1);
        }
    }
 
    for(int i = 0; i < m; i++)
    {
         
        // Sort the String
        arr2[i] = sortString(arr2[i]);
 
        // Display its anagrams
        // in arr1[]
        System.out.print(freq.get(arr2[i]) + " ");
    }
}
 
// Driver Code
public static void main(String[] args)
{
    String arr1[] = { "geeks", "learn",
                      "for", "egeks",
                      "ealrn" };
    int n = arr1.length;
 
    String arr2[] = { "kgees", "rof",
                      "nrael" };
    int m = arr2.length;
 
    count(arr1, arr2, n, m);
}
}
 
// This code is contributed by Amit Katiyar

Python3

# Python3 program to count the number
# of anagrams of each string in a
# given array present in another array
 
# Function to return the count of anagrams
def count(arr1, arr2, n, m):
     
    # Store the frequencies of
    # strings in arr1
    freq = {}
 
    for word in arr1:
         
        # Sort the string
        word = ' '.join(sorted(word))
 
        # Increase its frequency
        if word in freq.keys():
            freq[word] = freq[word] + 1
        else:
            freq[word] = 1
 
    for word in arr2:
         
        # Sort the string
        word = ' '.join(sorted(word))
 
        # Display its anagrams
        # in arr1
        if word in freq.keys():
            print(freq[word], end = " ")
        else:
            print(0, end = " ")
             
    print()    
 
# Driver Code
if __name__ == '__main__':
      
    arr1 = [ "geeks", "learn", "for",
             "egeks", "ealrn" ]
    n = len(arr1)
     
    arr2 = [ "kgees", "rof", "nrael" ]
    m = len(arr2)
 
    count(arr1, arr2, n, m)
 
# This code is contributed by Pawan_29

C#

// C# program to count the number
// of anagrams of each String in a
// given array present in
// another array
using System;
using System.Collections.Generic;
 
class GFG{
 
static String sortString(String inputString)
{
     
    // Convert input string to char array
    char []tempArray = inputString.ToCharArray();
       
    // Sort tempArray
    Array.Sort(tempArray);
       
    // Return new sorted string
    return new String(tempArray);
}
 
// Function to return the
// count of anagrams
static void count(String []arr1,
                  String []arr2,
                  int n, int m)
{
     
    // Store the frequencies
    // of Strings in arr1[]
    Dictionary<String,
               int> freq = new Dictionary<String,
                                          int>();
 
    for(int i = 0; i < n; i++)
    {
         
        // Sort the String
        arr1[i] = sortString(arr1[i]);
         
        // Increase its frequency
        // in the map
        if (freq.ContainsKey(arr1[i]))
        {
            freq[arr1[i]] =
            freq[arr1[i]] + 1;
        }
        else
        {
            freq.Add(arr1[i], 1);
        }
    }
 
    for(int i = 0; i < m; i++)
    {
         
        // Sort the String
        arr2[i] = sortString(arr2[i]);
 
        // Display its anagrams
        // in arr1[]
        Console.Write(freq[arr2[i]] + " ");
    }
}
 
// Driver Code
public static void Main(String[] args)
{
    String []arr1 = { "geeks", "learn",
                      "for", "egeks",
                      "ealrn" };
    int n = arr1.Length;
 
    String []arr2 = { "kgees", "rof",
                      "nrael" };
    int m = arr2.Length;
 
    count(arr1, arr2, n, m);
}
}
 
// This code is contributed by Amit Katiyar

Javascript

<script>
 
// Javascript program to count the number
// of anagrams of each String in a
// given array present in
// another array
 
function sortString(inputString)
{
      
    // Convert input string to char array
    let tempArray = inputString.split('');
        
    // Sort tempArray
    tempArray.sort();
        
    // Return new sorted string
    return tempArray.join("");
}
  
// Function to return the
// count of anagrams
function count(arr1, arr2, n, m)
{
      
    // Store the frequencies
    // of Strings in arr1[]
    let freq = new Map();
  
    for(let i = 0; i < n; i++)
    {
          
        // Sort the String
        arr1[i] = sortString(arr1[i]);
          
        // Increase its frequency
        // in the map
        if (freq.has(arr1[i]))
        {
            freq.set(arr1[i],
            freq.get(arr1[i]) + 1);
        }
        else
        {
            freq.set(arr1[i], 1);
        }
    }
  
    for(let i = 0; i < m; i++)
    {
          
        // Sort the String
        arr2[i] = sortString(arr2[i]);
  
        // Display its anagrams
        // in arr1[]
        document.write(freq.get(arr2[i]) + " ");
    }
}
 
// Driver code
 
    let arr1 = [ "geeks", "learn",
                      "for", "egeks",
                      "ealrn" ];
    let n = arr1.length;
  
    let arr2 = [ "kgees", "rof",
                      "nrael" ];
    let m = arr2.length;
  
    count(arr1, arr2, n, m);
  
 // This code is contributed by souravghosh0416.
</script>
Producción: 

2 1 2

 

Complejidad de tiempo: O(n*plog(p)+m*qlog(q)) donde n y m son los tamaños de la array y p y q son el tamaño máximo de la string presente en arr1 y arr2 respectivamente.
Espacio auxiliar: O(n+m). 

Sugiera si alguien tiene una mejor solución que sea más eficiente en términos de espacio y tiempo.
Este artículo es una contribución de Aarti_Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

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