Given a sequence of words, print all anagrams together using STL
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.
Implementation:
C++
// 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 list void 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 HashMap void 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 code int 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
# Python3 program for finding all anagram # pairs in the given array from collections import defaultdict # Utility function for # printing anagram list def 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 HashMap def 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 code if __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 |
cat act tca abcd geeksquiz zuiqkeegs geeksforgeeks forgeeksgeeks
Note: Compile above program with -std=c++11 flag in g++
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 Login to comment...