Count of anagrams of each string in an array present in another array
Given two arrays arr1[] and arr2[] consisting of strings, the task is to print the count of anagrams of every string in arr2[] that are present in arr1[].
Examples:
Input: arr1[] = [“geeks”, “learn”, “for”, “egeks”, “ealrn”], arr2[] = [“kgees”, “rof”, “nrael”]
Output: 2 1 2
Explanation:
Anagrams of arr2[0] (“kgees”) in arr1 : “geeks” and “egeks”.
Anagrams of arr2[1] (“rof”) in arr1 : “for”.
Anagrams of arr2[2] (“nrael”) in arr1 : “learn” and “ealrn”.Input: arr1[] = [“code”, “to”, “grow”, “odce”], arr2[] = [“edoc”, “wgor”, “ot”]
Output: 2 1 1
Explanation:
Anagrams of arr2[0] (“edoc”) in arr1 “code” and “odce”.
Anagrams of arr2[1] (“wgor”) in arr1 “grow”.
Anagrams of arr2[2] (“ot”) in arr1 “to”
Approach:
To solve the problem, the idea is to use frequency-counting with the help of HashMap. Store the frequencies of every string in arr1[] in hashmap in their sorted form. Traverse arr2[], sort strings in arr2[], and print their respective frequencies in HashMap.
Below is the implementation of the above approach:
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> |
2 1 2
Time Complexity: O(n*plog(p)+m*qlog(q)) where n and m are the sizes of both the array and p and q are the maximum size of string present in arr1 and arr2 respectively.
Auxiliary space: O(n+m).
Please suggest if someone has a better solution that is more efficient in terms of space and time.
This article is contributed by Aarti_Rathi. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above
Please Login to comment...