How to group Anagrams from an array of strings in C

1 Answer

0 votes
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_WORDS 128
#define MAX_LENGTH 16

// Function to sort characters in a string
void sortString(char *str) {
    qsort(str, strlen(str), sizeof(char), (int (*)(const void *, const void *))strcmp);
}

// Function to check if two strings are anagrams
int areAnagrams(const char *str1, const char *str2) {
    char sorted1[MAX_LENGTH], sorted2[MAX_LENGTH];
    
    strcpy(sorted1, str1);
    strcpy(sorted2, str2);
    
    sortString(sorted1);
    sortString(sorted2);
    
    return strcmp(sorted1, sorted2) == 0;
}

// Function to group anagrams
void groupAnagrams(char words[][MAX_LENGTH], int n) {
    int processed[MAX_WORDS] = {0}; // To track processed words

    for (int i = 0; i < n; i++) {
        if (processed[i]) continue; // Skip already grouped words

        printf("%s ", words[i]);
        processed[i] = 1;

        for (int j = i + 1; j < n; j++) {
            if (!processed[j] && areAnagrams(words[i], words[j])) {
                printf("%s ", words[j]);
                processed[j] = 1;
            }
        }
        printf("\n");
    }
}

int countWords(char words[][MAX_LENGTH]) {
    int word_count = 0;
    
    for (int i = 0; i < MAX_WORDS; i++) {
        if (strlen(words[i]) > 0) {  // Check if the string is not empty
            word_count++;
        } else {
            break;
        }
    }
    
    return word_count;
}

int main() {
    char words[MAX_WORDS][MAX_LENGTH] = {"eat", "tea", "tan", "ate", "nat", "bat", "tae"};

    groupAnagrams(words, countWords(words));

    return 0;
}


/*
run:

eat tea ate tae 
tan nat 
bat 

*/

 



answered Jun 9, 2025 by avibootz
...