# Count pairs in an array which have at least one digit common

• Difficulty Level : Hard
• Last Updated : 12 Aug, 2022

Given an array of N numbers. Find out the number of pairs i and j such that i < j and Ai and Aj have at least one digit common (For e.g. (11, 19) have 1 digit common but (36, 48) have no digit common)

Examples:

Input: A[] = { 10, 12, 24 }
Output:
Explanation: Two valid pairs are (10, 12) and (12, 24) which have atleast one digit common

Method 1 (Brute Force):

A naive approach to solve this problem is just by running two nested loops and consider all possible pairs. We can check if the two numbers have at least one common digit, by extracting every digit of the first number and try to find it in the extracted digits of second number. The task would become much easier we simply convert them into strings.

Below is the implementation of the above approach:

## C++

 `// CPP Program to count pairs in an array``// with some common digit``#include ` `using` `namespace` `std;` `// Returns true if the pair is valid,``// otherwise false``bool` `checkValidPair(``int` `num1, ``int` `num2)``{``    ``// converting integers to strings``    ``string s1 = to_string(num1);``    ``string s2 = to_string(num2);` `    ``// Iterate over the strings and check``    ``// if a character in first string is also``    ``// present in second string, return true``    ``for` `(``int` `i = 0; i < s1.size(); i++)``        ``for` `(``int` `j = 0; j < s2.size(); j++)``            ``if` `(s1[i] == s2[j])``                ``return` `true``;` `    ``// No common digit found``    ``return` `false``;``}` `// Returns the number of valid pairs``int` `countPairs(``int` `arr[], ``int` `n)``{``    ``int` `numberOfPairs = 0;` `    ``// Iterate over all possible pairs``    ``for` `(``int` `i = 0; i < n; i++)``        ``for` `(``int` `j = i + 1; j < n; j++)``            ``if` `(checkValidPair(arr[i], arr[j]))``                ``numberOfPairs++;` `    ``return` `numberOfPairs;``}` `// Driver Code to test above functions``int` `main()``{``    ``int` `arr[] = { 10, 12, 24 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]);``    ``cout << countPairs(arr, n) << endl;``    ``return` `0;``}`

## Java

 `// Java Program to count``// pairs in an array``// with some common digit``import` `java.io.*;` `class` `GFG``{``    ` `    ``// Returns true if the pair``    ``// is valid, otherwise false``    ``static` `boolean` `checkValidPair(``int` `num1,``                                  ``int` `num2)``    ``{``        ``// converting integers``        ``// to strings``        ``String s1 = Integer.toString(num1);``        ``String s2 = Integer.toString(num2);``    ` `        ``// Iterate over the strings``        ``// and check if a character``        ``// in first string is also``        ``// present in second string,``        ``// return true``        ``for` `(``int` `i = ``0``; i < s1.length(); i++)``            ``for` `(``int` `j = ``0``; j < s2.length(); j++)``                ``if` `(s1.charAt(i) == s2.charAt(j))``                    ``return` `true``;``    ` `        ``// No common``        ``// digit found``        ``return` `false``;``    ``}``    ` `    ``// Returns the number``    ``// of valid pairs``    ``static` `int` `countPairs(``int` `[]arr, ``int` `n)``    ``{``        ``int` `numberOfPairs = ``0``;``    ` `        ``// Iterate over all``        ``// possible pairs``        ``for` `(``int` `i = ``0``; i < n; i++)``            ``for` `(``int` `j = i + ``1``; j < n; j++)``                ``if` `(checkValidPair(arr[i], arr[j]))``                    ``numberOfPairs++;``    ` `        ``return` `numberOfPairs;``    ``}``    ` `    ``// Driver Code``    ``public` `static` `void` `main(String args[])``    ``{``        ``int` `[]arr = ``new` `int``[]{ ``10``, ``12``, ``24` `};``        ``int` `n = arr.length;``        ``System.out.print(countPairs(arr, n));``    ``}``}` `// This code is contributed``// by manish shaw.`

## Python3

 `# Python3 Program to count pairs in``# an array with some common digit` `# Returns true if the pair is``# valid, otherwise false``def` `checkValidPair(num1, num2) :``    ` `    ``# converting integers to strings``    ``s1 ``=` `str``(num1)``    ``s2 ``=` `str``(num2)` `    ``# Iterate over the strings and check if``    ``# a character in first string is also``    ``# present in second string, return true``    ``for` `i ``in` `range``(``len``(s1)) :``        ``for` `j ``in` `range``(``len``(s2)) :``            ``if` `(s1[i] ``=``=` `s2[j]) :``                ``return` `True``;` `    ``# No common digit found``    ``return` `False``;` `# Returns the number of valid pairs``def` `countPairs(arr, n) :``    ` `    ``numberOfPairs ``=` `0` `    ``# Iterate over all possible pairs``    ``for` `i ``in` `range``(n) :``        ``for` `j ``in` `range``(i ``+` `1``, n) :``            ``if` `(checkValidPair(arr[i], arr[j])) :``                ``numberOfPairs ``+``=` `1` `    ``return` `numberOfPairs` `# Driver Code``if` `__name__ ``=``=` `"__main__"` `:``    ``arr ``=` `[ ``10``, ``12``, ``24` `]``    ``n ``=` `len``(arr)``    ``print``(countPairs(arr, n))` `# This code is contributed by Ryuga`

## C#

 `// C# Program to count pairs in an array``// with some common digit``using` `System;` `class` `GFG {``    ` `    ``// Returns true if the pair is valid,``    ``// otherwise false``    ``static` `bool` `checkValidPair(``int` `num1, ``int` `num2)``    ``{``        ``// converting integers to strings``        ``string` `s1 = num1.ToString();``        ``string` `s2 = num2.ToString();``    ` `        ``// Iterate over the strings and check``        ``// if a character in first string is also``        ``// present in second string, return true``        ``for` `(``int` `i = 0; i < s1.Length; i++)``            ``for` `(``int` `j = 0; j < s2.Length; j++)``                ``if` `(s1[i] == s2[j])``                    ``return` `true``;``    ` `        ``// No common digit found``        ``return` `false``;``    ``}``    ` `    ``// Returns the number of valid pairs``    ``static` `int` `countPairs(``int` `[]arr, ``int` `n)``    ``{``        ``int` `numberOfPairs = 0;``    ` `        ``// Iterate over all possible pairs``        ``for` `(``int` `i = 0; i < n; i++)``            ``for` `(``int` `j = i + 1; j < n; j++)``                ``if` `(checkValidPair(arr[i], arr[j]))``                    ``numberOfPairs++;``    ` `        ``return` `numberOfPairs;``    ``}``    ` `    ``// Driver Code to test above functions``    ``static` `void` `Main()``    ``{``        ``int` `[]arr = ``new` `int``[]{ 10, 12, 24 };``        ``int` `n = arr.Length;``        ``Console.WriteLine(countPairs(arr, n));``    ``}``}` `// This code is contributed by manish shaw.`

## PHP

 ``

## Javascript

 ``

Output

`2`

Time Complexity: O(N2) where N is the size of array.

An efficient approach of solving this problem is creating a bit mask for every digit present in a particular number. Thus, for every digit to be present in a number if we have a mask of 1111111111.

```Digits -  0  1  2  3  4  5  6  7  8  9
|  |  |  |  |  |  |  |  |  |
Mask   -  1  1  1  1  1  1  1  1  1  1

Here 1 denotes that the corresponding ith digit is set.
For e.g. 1235 can be represented as
Digits -         0  1  2  3  4  5  6  7  8  9
|  |  |  |  |  |  |  |  |  |
Mask for 1235 -  0  1  1  1  0  1  0  0  0  0```

Now we just have to extract every digit of a number and make the corresponding bit set (1 << ith digit) and store the whole number as a mask. Careful analysis suggests that the maximum value of the mask is 1023 in decimal (which contains all the digits from 0 – 9). Since the same set of digits can exist in more than one number, we need to maintain a frequency array to store the count of mask value.

Let the frequencies of two masks i and j be freqi and freqj respectively,
If(i AND j) return true, means ith and jth mask contains atleast one common set bit which in turn implies that the numbers from which these masks have been built also contain a common digit
then,
ans += freqi * freqj [ if i != j ]
ans += (freqi * (freqi – 1)) / 2 [ if j == i ]

Below is the implementation of this efficient approach:

## C++

 `// CPP Program to count pairs in an array with``// some common digit``#include ``using` `namespace` `std;` `// This function calculates the mask frequencies``// for every present in the array``void` `calculateMaskFrequencies(``int` `arr[], ``int` `n,``                 ``unordered_map<``int``, ``int``>& freq)``{``    ``// Iterate over the array``    ``for` `(``int` `i = 0; i < n; i++) {` `        ``int` `num = arr[i];` `        ``// Creating an empty mask``        ``int` `mask = 0;` `        ``// Extracting every digit of the number``        ``// and updating corresponding bit in the``        ``// mask``        ``while` `(num > 0) {``            ``mask = mask | (1 << (num % 10));``            ``num /= 10;``        ``}` `        ``// Update the frequency array``        ``freq[mask]++;``    ``}``}` `// Function return the number of valid pairs``int` `countPairs(``int` `arr[], ``int` `n)``{``    ``// Store the mask frequencies``    ``unordered_map<``int``, ``int``> freq;` `    ``calculateMaskFrequencies(arr, n, freq);` `    ``long` `long` `int` `numberOfPairs = 0;` `    ``// Considering every possible pair of masks``    ``// and calculate pairs according to their``    ``// frequencies``    ``for` `(``int` `i = 0; i < 1024; i++) {``        ``numberOfPairs += (freq[i] * (freq[i] - 1)) / 2;``        ``for` `(``int` `j = i + 1; j < 1024; j++) {` `            ``// if it contains a common digit``            ``if` `(i & j)``                ``numberOfPairs += (freq[i] * freq[j]);``        ``}``    ``}``    ``return` `numberOfPairs;``}` `// Driver Code to test above functions``int` `main()``{``    ``int` `arr[] = { 10, 12, 24 };``    ``int` `n = ``sizeof``(arr) / ``sizeof``(arr[0]);``    ``cout << countPairs(arr, n) << endl;``    ``return` `0;``}`

## Java

 `// Java Program to count pairs in an array with``// some common digit``import` `java.io.*;``import` `java.util.*;``class` `GFG``{` `  ``// Store the mask frequencies``  ``public` `static` `Map freq = ``new` `HashMap();` `  ``// This function calculates the mask frequencies``  ``// for every present in the array``  ``public` `static` `void` `calculateMaskFrequencies(``int``[] arr,``int` `n)``  ``{` `    ``// Iterate over the array``    ``for``(``int` `i = ``0``; i < n; i++)``    ``{``      ``int` `num = arr[i];` `      ``// Creating an empty mask``      ``int` `mask = ``0``;` `      ``// Extracting every digit of the number``      ``// and updating corresponding bit in the``      ``// mask``      ``while``(num > ``0``)``      ``{``        ``mask = mask | (``1` `<< (num % ``10``));``        ``num /= ``10``;``      ``}` `      ``// Update the frequency array``      ``if``(freq.containsKey(mask))``      ``{``        ``freq.put(``new` `Integer(mask), freq.get(mask) + ``1``);``      ``}``      ``else``      ``{``        ``freq.put(``new` `Integer(mask), ``1``);``      ``}``    ``}``  ``}` `  ``// Function return the number of valid pairs``  ``public` `static` `int` `countPairs(``int``[] arr, ``int` `n)``  ``{``    ``calculateMaskFrequencies(arr, n);``    ``int` `numberOfPairs = ``0``;` `    ``// Considering every possible pair of masks``    ``// and calculate pairs according to their``    ``// frequencies``    ``for``(``int` `i = ``0``; i < ``1024``; i++)``    ``{``      ``int` `x = ``0``;``      ``if``(freq.containsKey(i))``      ``{``        ``x = freq.get(i);` `      ``}``      ``numberOfPairs += ((x) * (x - ``1``)) / ``2``;``      ``for``(``int` `j = i + ``1``; j < ``1024``; j++)``      ``{``        ``int` `y = ``0``;` `        ``// if it contains a common digit``        ``if``((i & j) != ``0``)``        ``{``          ``if``(freq.containsKey(j))``          ``{``            ``y = freq.get(j);``          ``}``          ``numberOfPairs += x * y;``        ``}``      ``}``    ``}``    ``return` `numberOfPairs;``  ``}` `  ``// Driver Code``  ``public` `static` `void` `main (String[] args)``  ``{``    ``int``[] arr = {``10``, ``12``, ``24``};``    ``int` `n = arr.length;       ``    ``System.out.println(countPairs(arr, n));``  ``}``}` `// This code is contributed by avanitrachhadiya2155`

## Python3

 `# Python3 Program to count pairs in an array``# with some common digit` `# This function calculates the mask frequencies``# for every present in the array``def` `calculateMaskFrequencies(arr, n, freq):``    ` `    ``# Iterate over the array``    ``for` `i ``in` `range``(n):` `        ``num ``=` `arr[i]` `        ``# Creating an empty mask``        ``mask ``=` `0` `        ``# Extracting every digit of the number``        ``# and updating corresponding bit in the``        ``# mask``        ``while` `(num > ``0``):``            ``mask ``=` `mask | (``1` `<< (num ``%` `10``))``            ``num ``/``/``=` `10``        ` `        ``# Update the frequency array``        ``freq[mask] ``=` `freq.get(mask, ``0``) ``+` `1``    ` `# Function return the number of valid pairs``def` `countPairs(arr, n):``    ` `    ``# Store the mask frequencies``    ``freq ``=` `dict``()` `    ``calculateMaskFrequencies(arr, n, freq)` `    ``numberOfPairs ``=` `0` `    ``# Considering every possible pair of masks``    ``# and calculate pairs according to their``    ``# frequencies``    ``for` `i ``in` `range``(``1024``):` `        ``x ``=` `0` `        ``if` `i ``in` `freq.keys():``            ``x ``=` `freq[i]` `        ``numberOfPairs ``+``=` `(x ``*` `(x ``-` `1``)) ``/``/` `2` `        ``for` `j ``in` `range``(i ``+` `1``, ``1024``):` `            ``y ``=` `0` `            ``if` `j ``in` `freq.keys():``                ``y ``=` `freq[j]``                ` `            ``# if it contains a common digit``            ``if` `(i & j):``                ``numberOfPairs ``+``=` `(x ``*` `y)``        ` `    ``return` `numberOfPairs` `# Driver Code``arr ``=` `[``10``, ``12``, ``24``]``n ``=` `len``(arr)``print``(countPairs(arr, n))` `# This code is contributed by mohit kumar`

## C#

 `// C# Program to count pairs in an array with``// some common digit``using` `System;``using` `System.Collections.Generic;` `public` `class` `GFG``{``  ` `    ``// Store the mask frequencies``    ``static` `Dictionary<``int``, ``int``> freq =  ``new` `Dictionary<``int``, ``int``>();``    ` `    ``// This function calculates the mask frequencies``    ``// for every present in the array``    ``public` `static` `void` `calculateMaskFrequencies(``int``[] arr,``int` `n)``    ``{``      ` `        ``// Iterate over the array``        ``for``(``int` `i = 0; i < n; i++)``        ``{``            ``int` `num = arr[i];`` ` `            ``// Creating an empty mask``            ``int` `mask = 0;`` ` `            ``// Extracting every digit of the number``            ``// and updating corresponding bit in the``            ``// mask``            ``while``(num > 0)``            ``{``                ``mask = mask | (1 << (num % 10));``                ``num /= 10;``            ``}`` ` `            ``// Update the frequency array``            ``if``(freq.ContainsKey(mask))``            ``{``                ``freq[mask]++;``            ``}``            ``else``            ``{``                ``freq.Add(mask, 1);``            ``}``        ``}``        ` `    ``}``    ``public` `static` `int` `countPairs(``int``[] arr, ``int` `n)``    ``{``        ``calculateMaskFrequencies(arr, n);``        ``int` `numberOfPairs = 0;`` ` `        ``// Considering every possible pair of masks``        ``// and calculate pairs according to their``        ``// frequencies``        ``for``(``int` `i = 0; i < 1024; i++)``        ``{``            ``int` `x = 0;``            ``if``(freq.ContainsKey(i))``            ``{``                ``x = freq[i];`` ` `            ``}``            ``numberOfPairs += ((x) * (x - 1)) / 2;``            ``for``(``int` `j = i + 1; j < 1024; j++)``            ``{``                ``int` `y = 0;`` ` `                ``// if it contains a common digit``                ``if``((i & j) != 0)``                ``{  ``                    ``if``(freq.ContainsKey(j))``                    ``{``                        ``y = freq[j];``                    ``}``                    ``numberOfPairs += x * y;``                ``}``            ``}``        ``}``        ``return` `numberOfPairs;``        ` `    ``}``  ` `    ``// Driver Code``    ``static` `public` `void` `Main ()``    ``{``        ``int``[] arr = {10, 12, 24};``        ``int` `n = arr.Length;       ``        ``Console.WriteLine(countPairs(arr, n));``    ``}``}` `// This code is contributed by rag2127`

## Javascript

 ``

Output

`2`

Time Complexity: O(N + 1024 * 1024), where N is the size of the array.

My Personal Notes arrow_drop_up