Find whether an array is subset of another array using Map
Last Updated :
08 Jun, 2021
Given two arrays: arr1[0..m-1] and arr2[0..n-1]. Find whether arr2[] is a subset of arr1[] or not. Both the arrays are not in sorted order. It may be assumed that elements in both arrays are distinct.
Examples:
Input: arr1[] = {11, 1, 13, 21, 3, 7}, arr2[] = {11, 3, 7, 1}
Output: arr2[] is a subset of arr1[]
Input: arr1[] = {1, 2, 3, 4, 5, 6}, arr2[] = {1, 2, 4}
Output: arr2[] is a subset of arr1[]
Input: arr1[] = {10, 5, 2, 23, 19}, arr2[] = {19, 5, 3}
Output: arr2[] is not a subset of arr1[]
Simple Approach: A simple approach is to run two nested loops. The outer loop picks all the elements of B[] one by one. The inner loop linearly searches for the element picked by the outer loop in A[]. If all elements are found, then print Yes, else print No. You can check the solution here.
Efficient Approach: Create a map to store the frequency of each distinct number present in A[]. Then we will check if each number of B[] is present in map or not. If present in the map, we will decrement the frequency value for that number by one and check for the next number. If map value for any number becomes zero, we will erase it from the map. If any number of B[] is not found in the map, we will set the flag value and break the loops and print No. Otherwise, we will print Yes.
C++
#include <bits/stdc++.h>
using namespace std;
int isSubset( int a[], int b[], int m, int n)
{
map< int , int > mp1;
for ( int i = 0; i < m; i++)
mp1[a[i]]++;
int f = 0;
for ( int i = 0; i < n; i++) {
if (mp1.find(b[i]) == mp1.end()) {
f = 1;
break ;
}
else {
mp1[b[i]]--;
if (mp1[b[i]] == 0)
mp1.erase(mp1.find(b[i]));
}
}
return f;
}
int main()
{
int arr1[] = { 11, 1, 13, 21, 3, 7 };
int arr2[] = { 11, 3, 7, 1 };
int m = sizeof (arr1) / sizeof (arr1[0]);
int n = sizeof (arr2) / sizeof (arr2[0]);
if (!isSubset(arr1, arr2, m, n))
cout<< "arr2[] is subset of arr1[] " ;
else
cout<< "arr2[] is not a subset of arr1[]" ;
return 0;
}
|
Java
import java.util.*;
class GFG
{
static int isSubset( int a[], int b[], int m, int n)
{
HashMap<Integer, Integer> mp1 = new
HashMap<Integer, Integer>();
for ( int i = 0 ; i < m; i++)
if (mp1.containsKey(a[i]))
{
mp1.put(a[i], mp1.get(a[i]) + 1 );
}
else
{
mp1.put(a[i], 1 );
}
int f = 0 ;
for ( int i = 0 ; i < n; i++)
{
if (!mp1.containsKey(b[i]))
{
f = 1 ;
break ;
}
else
{
mp1.put(b[i], mp1.get(b[i]) - 1 );
if (mp1.get(b[i]) == 0 )
mp1.remove(b[i]);
}
}
return f;
}
public static void main(String[] args)
{
int arr1[] = { 11 , 1 , 13 , 21 , 3 , 7 };
int arr2[] = { 11 , 3 , 7 , 1 };
int m = arr1.length;
int n = arr2.length;
if (isSubset(arr1, arr2, m, n)!= 1 )
System.out.print( "arr2[] is subset of arr1[] " );
else
System.out.print( "arr2[] is not a subset of arr1[]" );
}
}
|
Python
def isSubset(a, b, m, n) :
mp1 = {}
for i in range (m):
if a[i] not in mp1:
mp1[a[i]] = 0
mp1[a[i]] + = 1
f = 0
for i in range (n):
if b[i] not in mp1:
f = 1
break
else :
mp1[b[i]] - = 1
if (mp1[b[i]] = = 0 ):
mp1.pop(b[i])
return f
arr1 = [ 11 , 1 , 13 , 21 , 3 , 7 ]
arr2 = [ 11 , 3 , 7 , 1 ]
m = len (arr1)
n = len (arr2)
if ( not isSubset(arr1, arr2, m, n)):
print ( "arr2[] is subset of arr1[] " )
else :
print ( "arr2[] is not a subset of arr1[]" )
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int isSubset( int []a, int []b, int m, int n)
{
Dictionary< int , int > mp1 = new
Dictionary< int , int >();
for ( int i = 0; i < m; i++)
if (mp1.ContainsKey(a[i]))
{
mp1[a[i]] = mp1[a[i]] + 1;
}
else
{
mp1.Add(a[i], 1);
}
int f = 0;
for ( int i = 0; i < n; i++)
{
if (!mp1.ContainsKey(b[i]))
{
f = 1;
break ;
}
else
{
mp1[b[i]] = mp1[b[i]] - 1;
if (mp1[b[i]] == 0)
mp1.Remove(b[i]);
}
}
return f;
}
public static void Main(String[] args)
{
int []arr1 = {11, 1, 13, 21, 3, 7};
int []arr2 = {11, 3, 7, 1};
int m = arr1.Length;
int n = arr2.Length;
if (isSubset(arr1, arr2, m, n) != 1)
Console.Write( "arr2[] is subset of arr1[] " );
else
Console.Write( "arr2[] is not a subset of arr1[]" );
}
}
|
Javascript
<script>
function isSubset(a, b, m, n) {
let mp = new Map();
for (let i = 0; i < m; i++) {
if (mp.has(a[i])) {
mp.set(a[i], mp.get(a[i]) + 1)
} else {
mp.set(a[i], 1)
}
}
let f = 0;
for (let i = 0; i < n; i++) {
if (!mp.has(b[i])) {
f = 1;
break ;
}
else {
mp.set(b[i], mp.get(b[i]) - 1);
if (mp.get(b[i]) == 0)
mp. delete (b[i]);
}
}
return f;
}
let arr1 = [11, 1, 13, 21, 3, 7];
let arr2 = [11, 3, 7, 1];
let m = arr1.length;
let n = arr2.length;
if (!isSubset(arr1, arr2, m, n))
document.write( "arr2[] is subset of arr1[] " );
else
document.write( "arr2[] is not a subset of arr1[]" );
</script>
|
Output:
arr2[] is subset of arr1[]
Time Complexity: O (n)
Share your thoughts in the comments
Please Login to comment...