Find the size of largest subset of anagram words

Given an array of n string containing lowercase letters. Find the size of largest subset of string which are anagram of each others. An anagram of a string is another string that contains same characters, only the order of characters can be different. For example, “abcd” and “dabc” are anagram of each other.

Input: 
ant magenta magnate tan gnamate
Output: 3
Explanation
Anagram strings(1) - ant, tan
Anagram strings(2) - magenta, magnate,
                     gnamate
Thus, only second subset have largest
size i.e., 3

Input: 
cars bikes arcs steer 
Output: 2

Naive approach is to generate all possible subset and iterate from largest size of subset containing all string having same size and anagram of each others. Time complexity of this approach is O(2^n m) where n and m are the size of array and length of string respectively.

Efficient approach is to use hashing and sorting. Sort all characters of string and store the hash value(sorted string) in map(unordered_map in C++ and HashMap in java). At last check which one is the frequency sorted word with the highest number of occurrence.



filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to find the size of
// largest subset of anagram
#include <bits/stdc++.h>
using namespace std;
  
// Utility function to find size of
// largest subset of anagram
int largestAnagramSet(string arr[], int n)
{
  
    int maxSize = 0;
    unordered_map<string, int> count;
  
    for (int i = 0; i < n; ++i) {
  
        // sort the string
        sort(arr[i].begin(), arr[i].end());
  
        // Increment the count of string
        count[arr[i]] += 1;
  
        // Compute the maximum size of string
        maxSize = max(maxSize, count[arr[i]]);
    }
  
    return maxSize;
}
  
// Driver code
int main()
{
    string arr[] = { "ant", "magenta"
               "magnate", "tan", "gnamate" };
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << largestAnagramSet(arr, n) << "\n";
  
    string arr1[] = { "cars", "bikes", "arcs"
                                     "steer" };
    n = sizeof(arr1) / sizeof(arr[0]);
    cout << largestAnagramSet(arr1, n);
    return 0;
}

chevron_right


Output
3
2

Time complexity: O(nm\log(m)) where m is maximum size among all of the strings
Auxiliary space: O(n + m)

Best approach is to store the frequency array of each word. In this, we just need to iterate over the characters of the words and increment the frequency of current letter. At last, increment the count of only identical frequency array[] and take the maximum among them. This approach is best only when length of strings are maximum in comparison to the array size.

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ Program to find the size of
// largest subset of anagram
#include <bits/stdc++.h>
using namespace std;
  
// Utility function to find size of
// largest subset of anagram
int largestAnagramSet(string arr[], int n)
{
    int maxSize = 0;
  
    // Initialize map<> of vector array
    map<vector<int>, int> count;
  
    for (int i = 0; i < n; ++i) {
  
        // Vector array to store
        // frequency of element
        vector<int> freq(26);
  
        for (char ch : arr[i])
            freq[ch - 'a'] += 1;
  
        // Increment the count of
        // frequency array in map<>
        count[freq] += 1;
  
        // Compute the maximum size
        maxSize = max(maxSize, count[freq]);
    }
    return maxSize;
}
  
// Driver code
int main()
{
    string arr[] = { "ant", "magenta", "magnate",
                              "tan", "gnamate" };
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << largestAnagramSet(arr, n) << "\n";
  
    string arr1[] = { "cars", "bikes", "arcs"
                                     "steer" };
    n = sizeof(arr1) / sizeof(arr[0]);
    cout << largestAnagramSet(arr1, n);
    return 0;
}

chevron_right


Output
3
2

Time complexity: O(nm\log(n)) where m is maximum size among all of the strings
Auxiliary space: O(n + m)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : ManasChhabra2