Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find find anagrams among words, which are given in a file

How to find find anagrams among words, which are given in a file.

My solution:

Sort them and then find duplicates.

O(n mlgm). n: number of words, m : max size of the word

Any better solutions ?

thanks

like image 932
user1002288 Avatar asked Dec 03 '25 19:12

user1002288


1 Answers

This is a solution without sorting: I came up with a new solution I guess. It uses the Fundamental Theorem of Arithmetic. So the idea is to use an array of the first 26 prime numbers. Then for each letter in the input word we get the corresponding prime number A = 2, B = 3, C = 5, D = 7 … and then we calculate the product of our input word. Next we do this for each word in the dictionary and if a word matches our input word, then we add it to the resulting list. All anagrams will have the same signature because

Any integer greater than 1 is either a prime number, or can be written as a unique product of prime numbers (ignoring the order).

Here's the code. I convert the word to UPPERCASE and 65 is the position of A which corresponds to my first prime number:

private int[] PRIMES = new int[] { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31,
        37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103,
        107, 109, 113 };

This is the function:

 private long calculateProduct(char[] letters) {
    long result = 1L;
    for (char c : letters) {
        if (c < 65) {
            return -1;
        }
        int pos = c - 65;
        result *= PRIMES[pos];
    }
    return result;
}

Complete description is available here: Anagram on dev.vvirlan.com

like image 194
ACV Avatar answered Dec 06 '25 10:12

ACV



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!