Count of total anagram substrings - GeeksforGeeks

29 Apr, 2020
Given a string of lower alphabet characters, count total substring of this string which are anagram to each other.
Examples:
Input  : str = “xyyx”
Output : 4
Total substrings of this string which
are anagram to each other are 4 which 
can be enumerated as,
{“x”, “x”}, {"y", "y"}, {“xy”, “yx”}, 
{“xyy”, “yyx”}

Input  : str = "geeg"
Output : 4

The idea is to create a map. We use character frequencies as keys and corresponding counts as values. We can solve this problem by iterating over all substrings and counting frequencies of characters in every substring. We can update frequencies of characters while looping over substrings i.e. there won’t be an extra loop for counting frequency of characters.In below code, a map of key ‘vector type’ and value ‘int type’ is taken for storing occurrence of ‘frequency array of length 26’ of substring characters. Once occurrence ‘o’ of each frequency array is stored, total anagrams will be the sum of o*(o-1)/2 for all different frequency arrays because if a particular substring has ‘o’ anagrams in string total o*(o-1)/2 anagram pairs can be formed.
Below is the implementation of above idea.
C++
Java
Python3
C#
// C++ program to count total anagram// substring of a string#include <bits/stdc++.h>using namespace std;  // Total number of lowercase characters#define MAX_CHAR 26  // Utility method to return integer index// of character 'c'int toNum(char c){    return (c - 'a');}  // Returns count of total number of anagram// substrings of string strint countOfAnagramSubstring(string str){    int N = str.length();      // To store counts of substrings with given    // set of frequencies.    map<vector<int>, int> mp;      // loop for starting index of substring    for (int i=0; i<N; i++)    {        vector<int> freq(MAX_CHAR, 0);          // loop for length of substring        for (int j=i; j<N; j++)        {            // update freq array of current            // substring            freq[toNum(str[j])]++;              // increase count corresponding            // to this freq array            mp[freq]++;        }    }      // loop over all different freq array and    // aggregate substring count    int result = 0;    for (auto it=mp.begin(); it!=mp.end(); it++)    {        int freq = it->second;        result += ((freq) * (freq-1))/2;    }    return result;}  //  Driver code to test above methodsint main(){    string str = "xyyx";    cout << countOfAnagramSubstring(str) << endl;    return 0;}
import java.util.Arrays;import java.util.HashMap;  public class anagramPairCount {    public static void main(String[] args) {        subString("kkkk");    }      static void subString(String s){        HashMap<String, Integer> map= new HashMap<>();          for(int i = 0; i < s.length(); i++){            for(int j = i; j < s.length(); j++){                char[] valC = s.substring(i, j+1).toCharArray();                Arrays.sort(valC);                String val = new String(valC);                if (map.containsKey(val))                     map.put(val, map.get(val)+1);                else                     map.put(val, 1);            }        }        int anagramPairCount = 0;        for(String key: map.keySet()){            int n = map.get(key);            anagramPairCount += (n * (n-1))/2;        }        System.out.println(anagramPairCount);    }}
# Python3 program to count total anagram# substring of a stringdef countOfAnagramSubstring(s):          # Returns total number of anagram    # substrings in s    n = len(s)    mp = dict()          # loop for length of substring    for i in range(n):        sb = ''        for j in range(i, n):            sb = ''.join(sorted(sb + s[j]))            mp[sb] = mp.get(sb, 0)                          # increase count corresponding            # to this dict array            mp[sb] += 1      anas = 0          # loop over all different dictionary     # items and aggregate substring count    for k, v in mp.items():        anas += (v*(v-1))//2    return anas  # Driver Codes = "xyyx"print(countOfAnagramSubstring(s))  # This code is contributed by fgaim
using System;using System.Collections.Generic;    public class anagramPairCount {    public static void Main() {        subString("kkkk");    }      static void subString(String s){        Dictionary<string, int> map= new Dictionary<string, int>();          for(int i = 0; i < s.Length; i++){            for(int j = i; j < s.Length; j++){                char[] valC = s.Substring(i, j+1-i).ToCharArray();                Array.Sort(valC);                string val = new string(valC);                if (map.ContainsKey(val))                     map[val]=map[val]+1;                else                    map.Add(val, 1);            }        }        int anagramPairCount = 0;        foreach(string key in map.Keys){            int n = map[key];            anagramPairCount += (n * (n-1))/2;        }        Console.Write(anagramPairCount);    }}  // This code is contributed by AbhiThakur
4

This article is contributed by Utkarsh Trivedi. 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 write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
hacker1
ManojKumar120
abhaysingh290895
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Comments
Old Comments
Python program to check if a string is palindrome or not
Check for Balanced Brackets in an expression (well-formedness) using Stack
Different methods to reverse a string in C/C++
KMP Algorithm for Pattern Searching
Convert string to char array in C++
Array of Strings in C++ (5 Different Ways to Create)
Longest Palindromic Substring | Set 1
Caesar Cipher in Cryptography
Reverse words in a given string
Length of the longest substring without repeating characters