Given a sequence of words, print all anagrams together using STL - GeeksforGeeks

10 Jun, 2021
Given an array of words, print all anagrams together. 
For example, 
Input: array = {“cat”, “dog”, “tac”, “god”, “act”}
output: cat tac act, dog god
Explanation: cat tac and act are anagrams 
and dog and god are anagrams as 
they have the same set of characters.

Input: array = {“abc”, “def”, “ghi”}
output: abc, def, ghi
Explanation: There are no anagrams in the array.
Other approaches are discussed herein these posts:  
given-a-sequence-of-words-print-all-anagrams-together
given-a-sequence-of-words-print-all-anagrams-together-set-2
Approach: This is a HashMap solution using C++ Standard Template Library which stores the Key-Value Pair. In the hashmap, the key will be the sorted set of characters and value will be the output string. Two anagrams will be similar when their characters are sorted. Now,  
Store the vector elements in HashMap with key as the sorted string.If the key is same, then add the string to the value of HashMap(string vector).Traverse the HashMap and print the anagram strings.
Store the vector elements in HashMap with key as the sorted string.
If the key is same, then add the string to the value of HashMap(string vector).
Traverse the HashMap and print the anagram strings.
C++
Python3
// C++ program for finding all anagram// pairs in the given array#include <algorithm>#include <iostream>#include <unordered_map>#include <vector>using namespace std; // Utility function for// printing anagram listvoid printAnagram(unordered_map<string,vector<string> >& store){    for (auto it:store)    {        vector<string> temp_vec(it.second);        int size = temp_vec.size();               for (int i = 0; i < size; i++)        cout << temp_vec[i] << " ";                   cout << "\n";    }} // Utility function for storing// the vector of strings into HashMapvoid storeInMap(vector<string>& vec){    unordered_map<string,vector<string> > store;       for (int i = 0; i < vec.size(); i++)    {        string tempString(vec[i]);                 // sort the string        sort(tempString.begin(),tempString.end());                 // make hash of a sorted string        store[tempString].push_back(vec[i]);    }     // print utility function for printing    // all the anagrams    printAnagram(store);} // Driver codeint main(){    // initialize vector of strings    vector<string> arr;    arr.push_back("geeksquiz");    arr.push_back("geeksforgeeks");    arr.push_back("abcd");    arr.push_back("forgeeksgeeks");    arr.push_back("zuiqkeegs");    arr.push_back("cat");    arr.push_back("act");    arr.push_back("tca");     // utility function for storing    // strings into hashmap    storeInMap(arr);    return 0;}
# Python3 program for finding all anagram# pairs in the given arrayfrom collections import defaultdict # Utility function for# printing anagram listdef printAnagram(store: dict) -> None:         for (k, v) in store.items():        temp_vec = v        size = len(temp_vec)                 if (size > 1):            for i in range(size):                print(temp_vec[i], end = " ")                             print() # Utility function for storing# the vector of strings into HashMapdef storeInMap(vec: list) -> None:     store = defaultdict(lambda: list)         for i in range(len(vec)):        tempString = vec[i]        tempString = ''.join(sorted(tempString))         # Check for sorted string        # if it already exists        if (tempString not in store):            temp_vec = []            temp_vec.append(vec[i])            store[tempString] = temp_vec         else:                         # Push new string to            # already existing key            temp_vec = store[tempString]            temp_vec.append(vec[i])            store[tempString] = temp_vec     # Print utility function for    # printing all the anagrams    printAnagram(store) # Driver codeif __name__ == "__main__":     # Initialize vector of strings    arr = []    arr.append("geeksquiz")    arr.append("geeksforgeeks")    arr.append("abcd")    arr.append("forgeeksgeeks")    arr.append("zuiqkeegs")    arr.append("cat")    arr.append("act")    arr.append("tca")     # Utility function for storing    # strings into hashmap    storeInMap(arr) # This code is contributed by sanjeev2552
Note: Compile above program with -std=c++11 flag in g++ 
Output: 
cat act tca 
geeksforgeeks forgeeksgeeks 
geeksquiz zuiqkeegs 
Complexity Analysis: 
Time Complexity: O(n * m(log m)),  where m is the length of a word.A single traversal through the array is needed.
Space Complexity: O(n). There are n words in a string. The map requires O(n) space to store the strings.
This article is contributed by Mandeep Singh. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
andrew1234
ssharan3112
sanjeev2552
nareshsaharan1
amitazadi
Amazon
anagram
Snapdeal
STL
Hash
Strings
Amazon
Snapdeal
Hash
Strings
STL
anagram
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Hashing | Set 2 (Separate Chaining)
Counting frequencies of array elements
Most frequent element in an array
Double Hashing
Check if two arrays are equal or not
Reverse a string in Java
Write a program to reverse an array or string
Longest Common Subsequence | DP-4
C++ Data Types
Write a program to print all permutations of a given string