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++
// C++ implementation of the approach#include <bits/stdc++.h>using namespace std;Â
#define MAX 26Â
// Function that returns true if the mapping is possiblebool 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 codeint 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 possibledef 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 codeif __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 possiblefunction 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 codevar 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 zambiatek!



