Skip to content
Related Articles

Related Articles

Save Article
Improve Article
Save Article
Like Article

Number of index pairs such that s[i] and s[j] are anagrams

  • Last Updated : 13 Sep, 2021

Given an array s[] of N strings. The task is to find the number of pairs of indices (i, j) such that s[i] is an anagram of s[j].

Examples: 

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

Input: s[] = {“aaab”, “aaba”, “cde”, “dec”} 
Output:
(“aaab”, “aaba”) and (“cde”, “dec”) are the only valid pairs.



Input: s[] = {“ab”, “bc”, “cd”} 
Output:

Approach: An efficient approach is to sort each string and increase the count of it in a map. For each string in the map, if k is the count of it then (k * (k – 1)) / 2 is the number of valid pairs.

Below is the implementation of the above approach:  

C++




// CPP program to find number of pairs of integers
// i, j such that s[i] is an anagram of s[j].
#include <bits/stdc++.h>
using namespace std;
 
// Function to find number of pairs of integers
// i, j such that s[i] is an anagram of s[j].
int anagram_pairs(vector<string> s, int n)
{
    // To store count of strings
    map<string, int> mp;
 
    // Traverse all strings and store in the map
    for (int i = 0; i < n; i++) {
        // Sort the string
        sort(s[i].begin(), s[i].end());
 
        // Store in the map
        mp[s[i]]++;
    }
 
    // To store the number of pairs
    int ans = 0;
 
    // Traverse through the map
    for (auto i = mp.begin(); i != mp.end(); i++) {
        int k = i->second;
 
        // Count the pairs for each string
        ans += (k * (k - 1)) / 2;
    }
 
    // Return the required answer
    return ans;
}
 
// Driver code
int main()
{
    vector<string> s = { "aaab", "aaba", "baaa",
                         "cde", "dec" };
 
    int n = s.size();
 
    // Function call
    cout << anagram_pairs(s, n);
 
    return 0;
}

Java




// Java program to find number of pairs of integers
// i, j such that s[i] is an anagram of s[j].
import java.util.*;
class GFG
{
     
// Function to find number of pairs of integers
// i, j such that s[i] is an anagram of s[j].
static int anagram_pairs(String []s, int n)
{
    // To store count of strings
    Map<String, Integer> mp = new HashMap<>();
 
    // Traverse all strings and store in the map
    for (int i = 0; i < n; i++)
    {
        // Sort the string
        char []chArr = s[i].toCharArray();
        Arrays.sort(chArr);
        s[i] = new String(chArr);
         
        // Store in the map
        if(mp.containsKey(s[i]))
        {
            mp.put(s[i], mp.get(s[i]) + 1);
        }
        else
        {
            mp.put(s[i], 1);
        }
    }
 
    // To store the number of pairs
    int ans = 0;
 
    // Traverse through the map
    for (Map.Entry<String,
                   Integer> i : mp.entrySet())
    {
        int k = i.getValue();
 
        // Count the pairs for each string
        ans += (k * (k - 1)) / 2;
    }
 
    // Return the required answer
    return ans;
}
 
// Driver code
public static void main(String []args)
{
    String [] s = { "aaab", "aaba", "baaa",
                            "cde", "dec" };
 
    int n = s.length;
 
    // Function call
    System.out.println(anagram_pairs(s, n));
}
}
 
// This code is contributed by 29AjayKumar

Python3




# Python3 implementation to find 
# number of pairs of integers i, j 
# such that s[i] is an anagram of s[j]. 
   
# Function to find number of pairs of integers 
# i, j such that s[i] is an anagram of s[j].
def anagram_pairs(s, n):
    # To store the count of sorted strings
    mp = dict()
 
    # Traverse all strings and store in the map
    for i in range(n):
        # Sort the string
        temp_str = "".join(sorted(s[i]))
 
        # If string exists in map, increment count
        # Else create key value pair with count = 1
        if temp_str in mp:
            mp[temp_str] += 1
        else:
            mp[temp_str] = 1
 
    # To store the number of pairs
    ans = 0
 
    # Traverse through the map
    for k in mp.values():
 
        # Count the pairs for each string
        ans += (k * (k - 1)) // 2
 
    # Return the required answer
    return ans
 
# Driver code
if __name__ == "__main__":
    s = ["aaab", "aaba", "baaa", "cde", "dec"]
    n = len(s)
 
    print(anagram_pairs(s, n))
 
# This code is contributed by AnkitRai01

C#




// C# program to find number of pairs of integers
// i, j such that s[i] is an anagram of s[j].
using System;
using System.Collections.Generic;
 
class GFG
{
     
// Function to find number of pairs of integers
// i, j such that s[i] is an anagram of s[j].
static int anagram_pairs(String []s, int n)
{
    // To store count of strings
    Dictionary<String,
               int> mp = new Dictionary<String,
                                        int>();
 
    // Traverse all strings and store in the map
    for (int i = 0; i < n; i++)
    {
        // Sort the string
        char []chArr = s[i].ToCharArray();
        Array.Sort(chArr);
        s[i] = new String(chArr);
         
        // Store in the map
        if(mp.ContainsKey(s[i]))
        {
            mp[s[i]] = mp[s[i]] + 1;
        }
        else
        {
            mp.Add(s[i], 1);
        }
    }
 
    // To store the number of pairs
    int ans = 0;
 
    // Traverse through the map
    foreach (KeyValuePair<String,
                    int> i in mp)
    {
        int k = i.Value;
 
        // Count the pairs for each string
        ans += (k * (k - 1)) / 2;
    }
 
    // Return the required answer
    return ans;
}
 
// Driver code
public static void Main(String []args)
{
    String [] s = { "aaab", "aaba", "baaa",
                            "cde", "dec" };
 
    int n = s.Length;
 
    // Function call
    Console.WriteLine(anagram_pairs(s, n));
}
}
 
// This code is contributed by PrinciRaj1992

Javascript




<script>
// Javascript program to find number of pairs of integers
// i, j such that s[i] is an anagram of s[j].
 
// Function to find number of pairs of integers
// i, j such that s[i] is an anagram of s[j].
function anagram_pairs(s, n)
{
    // To store count of strings
    let mp = new Map();
 
    // Traverse all strings and store in the map
    for (let i = 0; i < n; i++) {
        // Sort the string
        let chArr = s[i].split("");
        chArr.sort();
        s[i] = chArr.join("");
 
        // Store in the map
        if(mp.has(s[i])){
            mp.set(s[i], mp.get(s[i]) + 1)
        }else{
            mp.set(s[i], 1)
        }
    }
 
    // To store the number of pairs
    let ans = 0;
 
    // Traverse through the map
    for (let i of mp) {
        let k = i[1];
 
        // Count the pairs for each string
        ans += Math.floor((k * (k - 1)) / 2);
    }
 
    // Return the required answer
    return ans;
}
 
// Driver code
    let s = [ "aaab", "aaba", "baaa", "cde", "dec" ];
 
    let n = s.length;
 
    // Function call
    document.write(anagram_pairs(s, n));
 
// This code is contributed by _saurabh_jaiswal
</script>
Output: 
4

 




My Personal Notes arrow_drop_up
Recommended Articles
Page :