Count Occurences of Anagrams

Given a word and a text, return the count of the occurences of anagrams of the word in the text(For eg: anagrams of word for are for, ofr, rof etc.))

Examples:

Input : forxxorfxdofr
        for
Output : 3
Explanation : Anagrams of the word for - for, orf, 
ofr appear in the text and hence the count is 3.

Input : aabaabaa
        aaba
Output : 4
Explanation : Anagrams of the word aaba - aaba, 
abaa each appear twice in the text and hence the
count is 4.


A simple approach is to traverse from start of the string considering substrings of length equal to the length of the given word and then check if this substring has all the characters of word.

filter_none

edit
close

play_arrow

link
brightness_4
code

// A Simple Java program to count anagrams of a
// pattern in a text.
import java.io.*;
import java.util.*;
  
public class GFG {
  
    // Function to find if two strings are equal
    static boolean araAnagram(String s1,
                              String s2)
    {
        // converting strings to char arrays
        char[] ch1 = s1.toCharArray();
        char[] ch2 = s2.toCharArray();
  
        // sorting both char arrays
        Arrays.sort(ch1);
        Arrays.sort(ch2);
  
        // Check for equality of strings
        if (Arrays.equals(ch1, ch2))
            return true;
        else
            return false;
    }
  
    static int countAnagrams(String text, String word)
    {
        int N = text.length();
        int n = word.length();
  
        // Initialize result
        int res = 0;
  
        for (int i = 0; i <= N - n; i++) {
  
            String s = text.substring(i, i + n);
  
            // Check if the word and substring are
            // anagram of each other.
            if (araAnagram(word, s))
                res++;
        }
      
        return res;
    }
  
    // Driver code
    public static void main(String args[])
    {
        String text = "forxxorfxdofr";
        String word = "for";
        System.out.print(countAnagrams(text, word));
    }
}

chevron_right


Output:

3

An Efficient Solution is to use count array to check for anagrams, we can construct current count window from previous window in O(1) time using sliding window concept.

filter_none

edit
close

play_arrow

link
brightness_4
code

// An efficient Java program to count anagrams of a
// pattern in a text.
import java.io.*;
import java.util.*;
  
public class GFG {
    final static int MAX_CHAR = 256
  
    // Function to find if two strings are equal
    static boolean isCountZero(int[] count)
    {
        for (int i = 0; i < MAX_CHAR; i++)
            if (count[i] != 0)
                return false;
        return true;
    }
  
    static int countAnagrams(String text, String word)
    {
        int N = text.length();
        int n = word.length();
  
        // Check for first window. The idea is to
        // use single count array to match counts
        int[] count = new int[MAX_CHAR];
        for (int i = 0; i < n; i++)
            count[word.charAt(i)]++;
        for (int i = 0; i < n; i++)
            count[text.charAt(i)]--;
  
        // If first window itself is anagram
        int res = 0;
        if (isCountZero(count))
            res++;
  
        for (int i = n; i < N; i++) {
  
            // Add last character of current
            // window
            count[text.charAt(i)]--;
  
            // Remove first character of previous
            // window.
            count[text.charAt(i - n)]++;
  
            // If count array is 0, we found an
            // anagram.
            if (isCountZero(count))
                res++;
        }
        return res;
    }
  
    // Driver code
    public static void main(String args[])
    {
        String text = "forxxorfxdofr";
        String word = "for";
        System.out.print(countAnagrams(text, word));
    }
}

chevron_right


Output:

3


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.