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++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; Â
#define MAX 26 Â
// Function that returns true if the mapping is possible bool canBeMapped(string s1, int l1, string s2, int l2) { Â
    // Both the strings are of un-equal lengths     if (l1 != l2)         return false ; Â
    // To store the frequencies of the     // characters in both the string     int freq1[MAX] = { 0 };     int freq2[MAX] = { 0 }; Â
    // Update frequencies of the characters     for ( int i = 0; i < l1; i++)         freq1[s1[i] - 'a' ]++;     for ( int i = 0; i < l2; i++)         freq2[s2[i] - 'a' ]++; Â
    // For every character of s1     for ( int i = 0; i < MAX; i++) { Â
        // If current character is         // not present in s1         if (freq1[i] == 0)             continue ;         bool found = false ; Â
        // Find a character in s2 that has frequency         // equal to the current character's         // frequency in s1         for ( int j = 0; j < MAX; j++) { Â
            // If such character is found             if (freq1[i] == freq2[j]) { Â
                // Set the frequency to -1 so that                 // it doesn't get picked again                 freq2[j] = -1; Â
                // Set found to true                 found = true ;                 break ;             }         } Â
        // If there is no character in s2         // that could be mapped to the         // current character in s1         if (!found)             return false ;     } Â
    return true ; } Â
// Driver code 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
// Java implementation of the approach import java.io.*; public class GFG { Â
    static int MAX = 26 ; Â
    // Function that returns true if the mapping is possible     public static boolean canBeMapped(String s1, int l1,                                         String s2, int l2)     {                  // Both the strings are of un-equal lengths         if (l1 != l2)             return false ; Â
        // To store the frequencies of the         // characters in both the string         int [] freq1 = new int [MAX];         int [] freq2 = new int [MAX]; Â
        // Update frequencies of the characters         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 every character of s1         for ( int i = 0 ; i < MAX; i++) { Â
            // If current character is             // not present in s1             if (freq1[i] == 0 )                 continue ;             boolean found = false ; Â
            // Find a character in s2 that has frequency             // equal to the current character's             // frequency in s1             for ( int j = 0 ; j < MAX; j++)             { Â
                // If such character is found                 if (freq1[i] == freq2[j])                 { Â
                    // Set the frequency to -1 so that                     // it doesn't get picked again                     freq2[j] = - 1 ; Â
                    // Set found to true                     found = true ;                     break ;                 }             } Â
            // If there is no character in s2             // that could be mapped to the             // current character in s1             if (!found)                 return false ;         } Â
        return true ;     } Â
    // Driver code     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" ); Â
    } } Â
// This code is contributed by // sanjeev2552 |
Python3
# Python 3 implementation of the approach Â
MAX = 26 Â
# Function that returns true if the mapping is possible def canBeMapped(s1, l1, s2, l2):     # Both the strings are of un-equal lengths     if (l1 ! = l2):         return False Â
    # To store the frequencies of the     # characters in both the string     freq1 = [ 0 for i in range ( MAX )]     freq2 = [ 0 for i in range ( MAX )] Â
    # Update frequencies of the characters     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 every character of s1     for i in range ( MAX ):         # If current character is         # not present in s1         if (freq1[i] = = 0 ):             continue         found = False Â
        # Find a character in s2 that has frequency         # equal to the current character's         # frequency in s1         for j in range ( MAX ):             # If such character is found             if (freq1[i] = = freq2[j]):                 # Set the frequency to -1 so that                 # it doesn't get picked again                 freq2[j] = - 1 Â
                # Set found to true                 found = True                 break Â
        # If there is no character in s2         # that could be mapped to the         # current character in s1         if (found = = False ):             return False Â
    return True Â
# Driver code if __name__ = = '__main__' : Â Â Â Â s1 = "axx" Â Â Â Â s2 = "cbc" Â Â Â Â l1 = len (s1) Â Â Â Â l2 = len (s2) Â
    if (canBeMapped(s1, l1, s2, l2)):         print ( "Yes" )     else :         print ( "No" )          # This code is contributed by # Surendra_Gangwar |
C#
// C# implementation of the approach using System; Â Â Â Â Â class GFG { Â Â Â Â static int MAX = 26; Â
    // Function that returns true     // if the mapping is possible     public static Boolean canBeMapped(String s1, int l1,                                       String s2, int l2)     {                  // Both the strings are of un-equal lengths         if (l1 != l2)             return false ; Â
        // To store the frequencies of the         // characters in both the string         int [] freq1 = new int [MAX];         int [] freq2 = new int [MAX]; Â
        // Update frequencies of the characters         for ( int i = 0; i < l1; i++)             freq1[s1[i] - 'a' ]++;         for ( int i = 0; i < l2; i++)             freq2[s2[i] - 'a' ]++; Â
        // For every character of s1         for ( int i = 0; i < MAX; i++)         { Â
            // If current character is             // not present in s1             if (freq1[i] == 0)                 continue ;             Boolean found = false ; Â
            // Find a character in s2 that has frequency             // equal to the current character's             // frequency in s1             for ( int j = 0; j < MAX; j++)             { Â
                // If such character is found                 if (freq1[i] == freq2[j])                 { Â
                    // Set the frequency to -1 so that                     // it doesn't get picked again                     freq2[j] = -1; Â
                    // Set found to true                     found = true ;                     break ;                 }             } Â
            // If there is no character in s2             // that could be mapped to the             // current character in s1             if (!found)                 return false ;         }         return true ;     } Â
    // Driver code     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" );     } } Â
// This code is contributed // by PrinciRaj1992 |
Javascript
<script> Â
// Javascript implementation of the approach Â
var MAX = 26; Â
// Function that returns true if the mapping is possible function canBeMapped(s1, l1, s2, l2) { Â
    // Both the strings are of un-equal lengths     if (l1 != l2)         return false ; Â
    // To store the frequencies of the     // characters in both the string     var freq1 = Array(MAX).fill(0);     var freq2 = Array(MAX).fill(0); Â
    // Update frequencies of the characters     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 every character of s1     for ( var i = 0; i < MAX; i++) { Â
        // If current character is         // not present in s1         if (freq1[i] == 0)             continue ;         var found = false ; Â
        // Find a character in s2 that has frequency         // equal to the current character's         // frequency in s1         for ( var j = 0; j < MAX; j++) { Â
            // If such character is found             if (freq1[i] == freq2[j]) { Â
                // Set the frequency to -1 so that                 // it doesn't get picked again                 freq2[j] = -1; Â
                // Set found to true                 found = true ;                 break ;             }         } Â
        // If there is no character in s2         // that could be mapped to the         // current character in s1         if (!found)             return false ;     } Â
    return true ; } Â
// Driver code 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> |
Yes
Â
Time Complexity: O(26*(L1+L2))
Auxiliary Space: O(26)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!