📌  相关文章
📜  将一个字符串的每个字符映射到另一个字符串,以便所有出现的字符都映射到同一个字符

📅  最后修改于: 2022-05-13 01:57:07.648000             🧑  作者: Mango

将一个字符串的每个字符映射到另一个字符串,以便所有出现的字符都映射到同一个字符

给定两个字符串s1s2 ,任务是检查第一个字符串的字符是否可以与第二个字符串的字符映射,这样如果字符ch1与某个字符ch2映射,那么所有出现的ch1将只被映射两个字符串都使用ch2

例子:

方法:如果两个字符串的长度不相等,则无法映射字符串,否则创建两个频率数组freq1[]freq2[] ,它们将分别存储给定字符串s1s2的所有字符的频率。现在,对于freq1[]中的每个非零值,在freq2[]中找到一个相等的值。如果来自freq1[]的所有非零值都可以映射到freq2[]中的某个值,那么答案是可能的,否则不是。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
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
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


输出:
Yes