Map every character of one string to another such that all occurrences are mapped to the same character
Given two strings s1 and s2, the task is to check if characters of the first string can be mapped with the character of the second string such that if a character ch1 is mapped with some character ch2 then all the occurrences of ch1 will only be mapped with ch2 for both the strings.
Examples:
Input: s1 = "axx", s2 = "cbc"
Output: Yes
'a' in s1 can be mapped to 'b' in s2
and 'x' in s1 can be mapped to 'c' in s2.
Input: s1 = "a", s2 = "df"
Output: No
Approach: If the lengths of both the strings are unequal then the strings cannot be mapped else create two frequency arrays freq1[] and freq2[] which will store the frequencies of all the characters of the given strings s1 and s2 respectively. Now, for every non-zero value in freq1[] find an equal value in freq2[]. If all the non-zero values from freq1[] can be mapped to some value in freq2[] then the answer is possible else not.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX 26
bool canBeMapped(string s1, int l1, string s2, int l2)
{
if (l1 != l2)
return false ;
int freq1[MAX] = { 0 };
int freq2[MAX] = { 0 };
for ( int i = 0; i < l1; i++)
freq1[s1[i] - 'a' ]++;
for ( int i = 0; i < l2; i++)
freq2[s2[i] - 'a' ]++;
for ( int i = 0; i < MAX; i++) {
if (freq1[i] == 0)
continue ;
bool found = false ;
for ( int j = 0; j < MAX; j++) {
if (freq1[i] == freq2[j]) {
freq2[j] = -1;
found = true ;
break ;
}
}
if (!found)
return false ;
}
return true ;
}
int main()
{
string s1 = "axx" ;
string s2 = "cbc" ;
int l1 = s1.length();
int l2 = s2.length();
if (canBeMapped(s1, l1, s2, l2))
cout << "Yes" ;
else
cout << "No" ;
return 0;
}
|
Java
import java.io.*;
public class GFG
{
static int MAX = 26 ;
public static boolean canBeMapped(String s1, int l1,
String s2, int l2)
{
if (l1 != l2)
return false ;
int [] freq1 = new int [MAX];
int [] freq2 = new int [MAX];
for ( int i = 0 ; i < l1; i++)
freq1[s1.charAt(i) - 'a' ]++;
for ( int i = 0 ; i < l2; i++)
freq2[s2.charAt(i) - 'a' ]++;
for ( int i = 0 ; i < MAX; i++) {
if (freq1[i] == 0 )
continue ;
boolean found = false ;
for ( int j = 0 ; j < MAX; j++)
{
if (freq1[i] == freq2[j])
{
freq2[j] = - 1 ;
found = true ;
break ;
}
}
if (!found)
return false ;
}
return true ;
}
public static void main(String[] args)
{
String s1 = "axx" ;
String s2 = "cbc" ;
int l1 = s1.length();
int l2 = s2.length();
if (canBeMapped(s1, l1, s2, l2))
System.out.println( "Yes" );
else
System.out.println( "No" );
}
}
|
Python3
MAX = 26
def canBeMapped(s1, l1, s2, l2):
if (l1 ! = l2):
return False
freq1 = [ 0 for i in range ( MAX )]
freq2 = [ 0 for i in range ( MAX )]
for i in range (l1):
freq1[ ord (s1[i]) - ord ( 'a' )] + = 1
for i in range (l2):
freq2[ ord (s2[i]) - ord ( 'a' )] + = 1
for i in range ( MAX ):
if (freq1[i] = = 0 ):
continue
found = False
for j in range ( MAX ):
if (freq1[i] = = freq2[j]):
freq2[j] = - 1
found = True
break
if (found = = False ):
return False
return True
if __name__ = = '__main__' :
s1 = "axx"
s2 = "cbc"
l1 = len (s1)
l2 = len (s2)
if (canBeMapped(s1, l1, s2, l2)):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static int MAX = 26;
public static Boolean canBeMapped(String s1, int l1,
String s2, int l2)
{
if (l1 != l2)
return false ;
int [] freq1 = new int [MAX];
int [] freq2 = new int [MAX];
for ( int i = 0; i < l1; i++)
freq1[s1[i] - 'a' ]++;
for ( int i = 0; i < l2; i++)
freq2[s2[i] - 'a' ]++;
for ( int i = 0; i < MAX; i++)
{
if (freq1[i] == 0)
continue ;
Boolean found = false ;
for ( int j = 0; j < MAX; j++)
{
if (freq1[i] == freq2[j])
{
freq2[j] = -1;
found = true ;
break ;
}
}
if (!found)
return false ;
}
return true ;
}
public static void Main(String[] args)
{
String s1 = "axx" ;
String s2 = "cbc" ;
int l1 = s1.Length;
int l2 = s2.Length;
if (canBeMapped(s1, l1, s2, l2))
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
}
}
|
Javascript
<script>
var MAX = 26;
function canBeMapped(s1, l1, s2, l2)
{
if (l1 != l2)
return false ;
var freq1 = Array(MAX).fill(0);
var freq2 = Array(MAX).fill(0);
for ( var i = 0; i < l1; i++)
freq1[s1[i].charCodeAt(0) - 'a' .charCodeAt(0)]++;
for ( var i = 0; i < l2; i++)
freq2[s2[i].charCodeAt(0) - 'a' .charCodeAt(0)]++;
for ( var i = 0; i < MAX; i++) {
if (freq1[i] == 0)
continue ;
var found = false ;
for ( var j = 0; j < MAX; j++) {
if (freq1[i] == freq2[j]) {
freq2[j] = -1;
found = true ;
break ;
}
}
if (!found)
return false ;
}
return true ;
}
var s1 = "axx" ;
var s2 = "cbc" ;
var l1 = s1.length;
var l2 = s2.length;
if (canBeMapped(s1, l1, s2, l2))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity: O(26*(L1+L2))
Auxiliary Space: O(26)
Last Updated :
15 Dec, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...