Number of index pairs such that s[i] and s[j] are anagrams
Last Updated :
05 Dec, 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:
Input: s[] = {“aaab”, “aaba”, “cde”, “dec”}
Output: 2
(“aaab”, “aaba”) and (“cde”, “dec”) are the only valid pairs.
Input: s[] = {“ab”, “bc”, “cd”}
Output: 0
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++
#include <bits/stdc++.h>
using namespace std;
int anagram_pairs(vector<string> s, int n)
{
map<string, int > mp;
for ( int i = 0; i < n; i++) {
sort(s[i].begin(), s[i].end());
mp[s[i]]++;
}
int ans = 0;
for ( auto i = mp.begin(); i != mp.end(); i++) {
int k = i->second;
ans += (k * (k - 1)) / 2;
}
return ans;
}
int main()
{
vector<string> s = { "aaab" , "aaba" , "baaa" ,
"cde" , "dec" };
int n = s.size();
cout << anagram_pairs(s, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int anagram_pairs(String []s, int n)
{
Map<String, Integer> mp = new HashMap<>();
for ( int i = 0 ; i < n; i++)
{
char []chArr = s[i].toCharArray();
Arrays.sort(chArr);
s[i] = new String(chArr);
if (mp.containsKey(s[i]))
{
mp.put(s[i], mp.get(s[i]) + 1 );
}
else
{
mp.put(s[i], 1 );
}
}
int ans = 0 ;
for (Map.Entry<String,
Integer> i : mp.entrySet())
{
int k = i.getValue();
ans += (k * (k - 1 )) / 2 ;
}
return ans;
}
public static void main(String []args)
{
String [] s = { "aaab" , "aaba" , "baaa" ,
"cde" , "dec" };
int n = s.length;
System.out.println(anagram_pairs(s, n));
}
}
|
Python3
def anagram_pairs(s, n):
mp = dict ()
for i in range (n):
temp_str = "".join( sorted (s[i]))
if temp_str in mp:
mp[temp_str] + = 1
else :
mp[temp_str] = 1
ans = 0
for k in mp.values():
ans + = (k * (k - 1 )) / / 2
return ans
if __name__ = = "__main__" :
s = [ "aaab" , "aaba" , "baaa" , "cde" , "dec" ]
n = len (s)
print (anagram_pairs(s, n))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int anagram_pairs(String []s, int n)
{
Dictionary<String,
int > mp = new Dictionary<String,
int >();
for ( int i = 0; i < n; i++)
{
char []chArr = s[i].ToCharArray();
Array.Sort(chArr);
s[i] = new String(chArr);
if (mp.ContainsKey(s[i]))
{
mp[s[i]] = mp[s[i]] + 1;
}
else
{
mp.Add(s[i], 1);
}
}
int ans = 0;
foreach (KeyValuePair<String,
int > i in mp)
{
int k = i.Value;
ans += (k * (k - 1)) / 2;
}
return ans;
}
public static void Main(String []args)
{
String [] s = { "aaab" , "aaba" , "baaa" ,
"cde" , "dec" };
int n = s.Length;
Console.WriteLine(anagram_pairs(s, n));
}
}
|
Javascript
<script>
function anagram_pairs(s, n)
{
let mp = new Map();
for (let i = 0; i < n; i++) {
let chArr = s[i].split( "" );
chArr.sort();
s[i] = chArr.join( "" );
if (mp.has(s[i])){
mp.set(s[i], mp.get(s[i]) + 1)
} else {
mp.set(s[i], 1)
}
}
let ans = 0;
for (let i of mp) {
let k = i[1];
ans += Math.floor((k * (k - 1)) / 2);
}
return ans;
}
let s = [ "aaab" , "aaba" , "baaa" , "cde" , "dec" ];
let n = s.length;
document.write(anagram_pairs(s, n));
</script>
|
Time Complexity: O(n2 * logn)
Auxiliary Space: O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...