Group words with same set of characters

08 Jul, 2022
Given a list of words with lower cases. Implement a function to find all Words that have the same unique character set . 
Example:  
Input: words[] = { "may", "student", "students", "dog",
                 "studentssess", "god", "cat", "act",
                 "tab", "bat", "flow", "wolf", "lambs",
                 "amy", "yam", "balms", "looped", 
                 "poodle"};
Output : 
looped, poodle, 
lambs, balms, 
flow, wolf, 
tab, bat, 
may, amy, yam, 
student, students, studentssess, 
dog, god, 
cat, act, 

All words with same set of characters are printed 
together in a line.
The idea is to use hashing. We generate a key for all words. The key contains all unique character (Size of key is at most 26 for lower case alphabets). We store indexes of words as values for a key. Once we have filled all keys and values in hash table, we can print the result by traversing the table.
Below is the implementation of above idea.  
C++
Java
Python3
C#
// C++ program to print all words that have// the same unique character set#include<bits/stdc++.h>using namespace std;#define MAX_CHAR 26 // Generates a key from given string. The key// contains all unique characters of given string in// sorted order consisting of only distinct elements.string getKey(string &str){    bool visited[MAX_CHAR] = { false };     // store all unique characters of current    // word in key    for (int j = 0; j < str.length(); j++)        visited[str[j] - 'a'] = true ;    string key = "";    for (int j=0; j < MAX_CHAR; j++)        if (visited[j])            key = key + (char)('a'+j);    return key;} // Print all words together with same character sets.void wordsWithSameCharSet(string words[], int n){    // Stores indexes of all words that have same    // set of unique characters.    unordered_map <string, vector <int> > Hash;     // Traverse all words    for (int i=0; i<n; i++)    {        string key = getKey(words[i]);        Hash[key].push_back(i);    }     // print all words that have the same unique character set    for (auto it = Hash.begin(); it!=Hash.end(); it++)    {      for (auto v=(*it).second.begin(); v!=(*it).second.end(); v++)          cout << words[*v] << ", ";      cout << endl;    }} // Driver program to test above functionint main(){    string words[] = { "may", "student", "students", "dog",                 "studentssess", "god", "cat", "act", "tab",                 "bat", "flow", "wolf", "lambs", "amy", "yam",                 "balms", "looped", "poodle"};    int n = sizeof(words)/sizeof(words[0]);    wordsWithSameCharSet(words, n);    return 0;}
// Java program to print all words that have// the same unique character setimport java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.Map.Entry;public class GFG {      static final int MAX_CHAR = 26;          // Generates a key from given string. The key    // contains all unique characters of given string    // in sorted order consisting of only distinct elements.    static String getKey(String str)    {        boolean[] visited = new boolean[MAX_CHAR];        Arrays.fill(visited, false);              // store all unique characters of current        // word in key        for (int j = 0; j < str.length(); j++)            visited[str.charAt(j) - 'a'] = true ;        String key = "";        for (int j=0; j < MAX_CHAR; j++)            if (visited[j])                key = key + (char)('a'+j);        return key;    }          // Print all words together with same character sets.    static void wordsWithSameCharSet(String words[], int n)    {        // Stores indexes of all words that have same        // set of unique characters.        //unordered_map <string, vector <int> > Hash;        HashMap<String, ArrayList<Integer>> Hash = new HashMap<>();              // Traverse all words        for (int i=0; i<n; i++)        {            String key = getKey(words[i]);                         // if the key is already in the map            // then get its corresponding value            // and update the list and put it in the map            if(Hash.containsKey(key))            {                ArrayList<Integer> get_al = Hash.get(key);                get_al.add(i);                Hash.put(key, get_al);            }                         // if key is not present in the map            // then create a new list and add            // both key and the list            else            {                ArrayList<Integer> new_al = new ArrayList<>();                new_al.add(i);                Hash.put(key, new_al);            }        }              // print all words that have the same unique character set        for (Entry<String, ArrayList<Integer>> it : Hash.entrySet())        {            ArrayList<Integer> get =it.getValue();            for (Integer v:get)                System.out.print( words[v] + ", ");            System.out.println();        }    }          // Driver program to test above function    public static void main(String args[])    {        String words[] = { "may", "student", "students", "dog",                     "studentssess", "god", "cat", "act", "tab",                     "bat", "flow", "wolf", "lambs", "amy", "yam",                     "balms", "looped", "poodle"};        int n = words.length;        wordsWithSameCharSet(words, n);    }}// This code is contributed by Sumit Ghosh
# Python program to print all words that# have the same unique character set # Function to group all strings with same charactersfrom collections import Counter def groupStrings(input):    # traverse all strings one by one    # dict is an empty dictionary    dict={}         for word in input:        # sort the current string and take it's        # sorted value as key        # sorted return list of sorted characters        # we need to join them to get key as string        # Counter() method returns dictionary with frequency of        # each character as value        wordDict=Counter(word)         # now get list of keys        key = wordDict.keys()         # now sort these keys        key = sorted(key)         # join these characters to produce key string        key = ''.join(key)                 # now check if this key already exist in        # dictionary or not        # if exist then simply append current word        # in mapped list on key        # otherwise first assign empty list to key and        # then append current word in it        if key in dict.keys():            dict[key].append(word)        else:            dict[key]=[]            dict[key].append(word)         # now traverse complete dictionary and print        # list of mapped strings in each key separated by ,    for (key,value) in dict.items():        print (','.join(dict[key]))         # Driver programif __name__ == "__main__":    input=['may','student','students','dog','studentssess','god','cat','act','tab','bat','flow','wolf','lambs','amy','yam','balms','looped','poodle']    groupStrings(input)
// C# program to print all words that// have the same unique character setusing System;using System.Collections.Generic; class GFG{  static readonly int MAX_CHAR = 26;  // Generates a key from given string. The// key contains all unique characters of// given string in sorted order consisting// of only distinct elements.static String getKey(String str){    bool[] visited = new bool[MAX_CHAR];      // Store all unique characters of current    // word in key    for(int j = 0; j < str.Length; j++)        visited[str[j] - 'a'] = true;             String key = "";         for(int j = 0; j < MAX_CHAR; j++)        if (visited[j])            key = key + (char)('a' + j);                 return key;}  // Print all words together with same character sets.static void wordsWithSameCharSet(String []words, int n){         // Stores indexes of all words that have same    // set of unique characters.    //unordered_map <string, vector <int> > Hash;    Dictionary<String,               List<int>> Hash = new Dictionary<String,                                                List<int>>();      // Traverse all words    for (int i = 0; i < n; i++)    {        String key = getKey(words[i]);                 // If the key is already in the map        // then get its corresponding value        // and update the list and put it        // in the map        if (Hash.ContainsKey(key))        {            List<int> get_al = Hash[key];            get_al.Add(i);            Hash[key]= get_al;        }                 // If key is not present in the map        // then create a new list and add        // both key and the list        else        {            List<int> new_al = new List<int>();            new_al.Add(i);            Hash.Add(key, new_al);        }    }      // Print all words that have the    // same unique character set    foreach(KeyValuePair<String, List<int>> it in Hash)    {        List<int> get =it.Value;        foreach(int v in get)            Console.Write( words[v] + ", ");                     Console.WriteLine();    }}  // Driver codepublic static void Main(String []args){    String []words = { "may", "student", "students",                       "dog", "studentssess", "god",                       "cat", "act", "tab",                       "bat", "flow", "wolf",                       "lambs", "amy", "yam",                       "balms", "looped", "poodle"};                            int n = words.Length;         wordsWithSameCharSet(words, n);}} // This code is contributed by Princi Singh
looped, poodle, 
student, students, studentssess, 
may, amy, yam, 
dog, god, 
cat, act, 
tab, bat, 
lambs, balms, 
flow, wolf, 
Time complexity: O(n*k) where n is number of words in dictionary and k is maximum length of a word.Auxilary Space: O(n*k), where n is number of words in dictionary and k is maximum length of a word.
This article is contributed by Nishant 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. 
lostboy24
princi singh
akshaysingh98088
amartyaghoshgfg
rohitmishra051000
hardikkoriintern
Hash
Strings
Hash
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Given an array A[] and a number x, check for pair in A[] with sum as x (aka Two Sum)
What is Hashing | A Complete Tutorial
Internal Working of HashMap in Java
Count pairs with given sum
Longest Consecutive Subsequence
Write a program to reverse an array or string
Reverse a string in Java
Write a program to print all permutations of a given string
C++ Data Types
Different Methods to Reverse a String in C++