Count equal pairs from given string arrays
Given two string arrays s1[] and s2[]. The task is to find the count of pairs (s1[i], s2[j]) such that s1[i] = s2[j]. Note that an element s1[i] can only participate in a single pair.
Examples:
Input: s1[] = {“abc”, “def”}, s2[] = {“abc”, “abc”}
Output: 1
Explanation: Only valid pair is (s1[0], s2[0]) or (s1[0], s2[1])
Note that even though “abc” appears twice in the
array s2[] but it can only make a single pair
as “abc” only appears once in the array s1[]
Input: s1[] = {“aaa”, “aaa”}, s2[] = {“aaa”, “aaa”}
Output: 2
Naive approach:
Generate all the pairs and check for the given condition, if it satisfy then increment the count by 1.
- Initialise a variable count = 0
- Generate all the pair
- Check if this pair is already considered, then continue
- Check if the pair satisfies the given condition
- Replace the string in s2 with “-1”, just to mark that we have considered this string with some pair
- Increment the count by 1
- Return the count
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int count_pairs(string s1[], string s2[], int n1, int n2)
{
int count = 0;
for ( int i = 0; i < n1; i++) {
for ( int j = 0; j < n2; j++) {
if (s2[j] == "-1" )
continue ;
if (s1[i] == s2[j]) {
s2[j] = "-1" ;
count++;
break ;
}
}
}
return count;
}
int main()
{
string s1[] = { "abc" , "def" , "abc" };
string s2[] = { "abc" , "abc" };
int n1 = sizeof (s1) / sizeof (string);
int n2 = sizeof (s2) / sizeof (string);
cout << count_pairs(s1, s2, n1, n2);
return 0;
}
|
Java
import java.util.Arrays;
public class Gfg {
public static int count_pairs(String s1[], String s2[],
int n1, int n2)
{
int count = 0 ;
for ( int i = 0 ; i < n1; i++) {
for ( int j = 0 ; j < n2; j++) {
if (s2[j] == "-1" )
continue ;
if (s1[i].equals(s2[j])) {
s2[j] = "-1" ;
count++;
break ;
}
}
}
return count;
}
public static void main(String[] args)
{
String s1[] = { "abc" , "def" , "abc" };
String s2[] = { "abc" , "abc" };
int n1 = s1.length;
int n2 = s2.length;
System.out.println(count_pairs(s1, s2, n1, n2));
}
}
|
Python3
def count_pairs( s1, s2, n1, n2):
count = 0 ;
for i in range ( 0 ,n1):
for j in range ( 0 ,n2):
if (s2[j] = = "-1" ):
continue ;
if (s1[i] = = s2[j]) :
s2[j] = "-1" ;
count + = 1 ;
break ;
return count;
s1 = [ "abc" , "def" , "abc" ];
s2 = [ "abc" , "abc" ];
n1 = len (s1);
n2 = len (s2);
print (count_pairs(s1, s2, n1, n2));
|
C#
using System;
using System.Collections.Generic;
class GFG {
static int count_pairs( string [] s1, string [] s2, int n1, int n2)
{
int count = 0;
for ( int i = 0; i < n1; i++) {
for ( int j = 0; j < n2; j++) {
if (s2[j] == "-1" )
continue ;
if (s1[i] == s2[j]) {
s2[j] = "-1" ;
count++;
break ;
}
}
}
return count;
}
public static void Main()
{
string [] s1 = { "abc" , "def" , "abc" };
string [] s2 = { "abc" , "abc" };
int n1 = s1.Length;
int n2 = s2.Length;
Console.Write(count_pairs(s1, s2, n1, n2));
}
}
|
Javascript
function count_pairs(s1, s2, n1, n2)
{
let count = 0;
for (let i = 0; i < n1; i++) {
for (let j = 0; j < n2; j++) {
if (s2[j] == "-1" )
continue ;
if (s1[i] == s2[j]) {
s2[j] = "-1" ;
count++;
break ;
}
}
}
return count;
}
let s1 = [ "abc" , "def" , "abc" ];
let s2 = [ "abc" , "abc" ];
let n1 = s1.length;
let n2 = s2.length;
document.write(count_pairs(s1, s2, n1, n2));
|
Time Complexity: O(n1*n2), Where n1 and n2 are the lengths of given string array s1 and s2 respectively.
Auxiliary Space: O(1)
Approach:
- Create an unordered_map to store the frequencies of all the strings of the array s1[].
- Now for every string of the array, check whether a string equal to the current string is present in the map or not.
- If yes then increment the count and decrement the frequency of the string from the map. This is because a string can only make a pair once.
- Print the count in the end.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int count_pairs(string s1[], string s2[], int n1, int n2)
{
unordered_map<string, int > mp;
for ( int i = 0; i < n1; i++)
mp[s1[i]]++;
int cnt = 0;
for ( int i = 0; i < n2; i++) {
if (mp[s2[i]] > 0) {
cnt++;
mp[s2[i]]--;
}
}
return cnt;
}
int main()
{
string s1[] = { "abc" , "def" };
string s2[] = { "abc" , "abc" };
int n1 = sizeof (s1) / sizeof (string);
int n2 = sizeof (s2) / sizeof (string);
cout << count_pairs(s1, s2, n1, n2);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int count_pairs(String s1[],
String s2[],
int n1, int n2)
{
HashMap<String,
Integer> mp = new HashMap<String,
Integer>();
for ( int i = 0 ; i < n1; i++)
mp.put(s1[i], 0 );
for ( int i = 0 ; i < n1; i++)
mp.put(s1[i], mp.get(s1[i]) + 1 );
int cnt = 0 ;
for ( int i = 0 ; i < n2; i++)
{
if (mp.get(s2[i]) > 0 )
{
cnt++;
mp.put(s2[i], mp.get(s2[i]) - 1 );
}
}
return cnt;
}
public static void main (String[] args)
{
String s1[] = { "abc" , "def" };
String s2[] = { "abc" , "abc" };
int n1 = s1.length;
int n2 = s2.length;
System.out.println(count_pairs(s1, s2, n1, n2));
}
}
|
Python3
def count_pairs(s1, s2,n1,n2):
mp = {s1[i]: 0 for i in range ( len (s1))}
for i in range (n1):
mp[s1[i]] + = 1
cnt = 0
for i in range (n2):
if (mp[s2[i]] > 0 ):
cnt + = 1
mp[s2[i]] - = 1
return cnt
if __name__ = = '__main__' :
s1 = [ "abc" , "def" ]
s2 = [ "abc" , "abc" ]
n1 = len (s1)
n2 = len (s2)
print (count_pairs(s1, s2, n1, n2))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int count_pairs(String []s1,
String []s2,
int n1, int n2)
{
Dictionary<String,
int > mp = new Dictionary<String,
int >();
for ( int i = 0; i < n1; i++)
mp.Add(s1[i], 0);
for ( int i = 0; i < n1; i++)
{
var v = mp[s1[i]] + 1;
mp.Remove(s1[i]);
mp.Add(s1[i], v);
}
int cnt = 0;
for ( int i = 0; i < n2; i++)
{
if (mp[s2[i]] > 0)
{
cnt++;
if (mp.ContainsKey(s2[i]))
{
var v = mp[s2[i]] - 1;
mp.Remove(s2[i]);
mp.Add(s2[i], v);
}
else
mp.Add(s2[i], mp[s2[i]] - 1);
}
}
return cnt;
}
public static void Main (String[] args)
{
String []s1 = { "abc" , "def" };
String []s2 = { "abc" , "abc" };
int n1 = s1.Length;
int n2 = s2.Length;
Console.WriteLine(count_pairs(s1, s2, n1, n2));
}
}
|
Javascript
<script>
function count_pairs(s1, s2, n1, n2)
{
var mp = new Map();
for ( var i = 0; i < n1; i++)
{
if (mp.has(s1[i]))
{
mp.set(s1[i], mp.get(s1[i])+1)
}
else
{
mp.set(s1[i], 1)
}
}
var cnt = 0;
for ( var i = 0; i < n2; i++) {
if (mp.get(s2[i]) > 0) {
cnt++;
mp.set(s2[i], mp.get(s2[i])-1)
}
}
return cnt;
}
var s1 = [ "abc" , "def" ];
var s2 = [ "abc" , "abc" ];
var n1 = s1.length;
var n2 = s2.length;
document.write( count_pairs(s1, s2, n1, n2));
</script>
|
Time Complexity: O(n1+n2), Where n1 and n2 are the lengths of given string array s1 and s2 respectively.
Auxiliary Space: O(n1)
Last Updated :
03 Feb, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...