Check if characters of one string can be swapped to form other - GeeksforGeeks

07 May, 2021
Two strings are given, we need to find whether we can form second string by swapping the character of the first string. Examples:  
Input : str1 = "geeksforgeeks" 
        str2 = "geegeeksksfor"
Output : YES

Input : str1 = "geeksfor"  
        str2 = "geeekfor"
Output : NO
 
First of all, we will find the length of strings and if lengths are not equal that means we can not form the target string by swapping characters of the first string. If lengths are equal then we iterate through the first string and create a map for it and after that, we will iterate through the second string and decrease the count of the map if any of the indexes go negative in the map that means we can not form the target string otherwise we can form the target string. 
Algorithm-
1- l1 = str1.length()  &&   l2 = str2.length()
2- if (l1 != l2)
    print "NO" 
3- Else
   map[26] = {0};
   for i=0 to l1
    map[str1[i]-'a']++;
   for i=0 to l2
     map[str2[i]-'a']--;
     if (map[str[2]-'a'<0)
      print "NO"
4- if no index goes negative print "YES"
5- End
 
 
C++
Java
Python3
C#
PHP
Javascript
#include <bits/stdc++.h>using namespace std;const int MAX = 26; bool targetstring(string str1, string str2){    int l1 = str1.length();    int l2 = str2.length();     // if length is not same print no    if (l1 != l2)        return false;     int map[MAX] = { 0 };     // Count frequencies of character in    // first string.    for (int i = 0; i < l1; i++)        map[str1[i] - 'a']++;     // iterate through the second string    // decrement counts of characters in    // second string    for (int i = 0; i < l2; i++) {        map[str2[i] - 'a']--;         // Since lengths are same, some        // value would definitely become        // negative if result is false.        if (map[str2[i] - 'a'] < 0)            return false;    }     return true;} // driver functionint main(){    string str1 = "geeksforgeeks";    string str2 = "geegeeksksfor";    if (targetstring(str1, str2))        cout << "YES";    else        cout << "NO";     return 0;}
// Java program to check if// characters of one string// can be swapped to form otherclass GFG{static int MAX = 26; static boolean targetstring(String str1,                            String str2){    int l1 = str1.length();    int l2 = str2.length();     // if length is not same print no    if (l1 != l2)        return false;     int []map = new int[MAX];         // Count frequencies of    // character in first string.    for (int i = 0; i < l1; i++)        map[str1.charAt(i) - 'a']++;     // iterate through the second    // string decrement counts of    // characters in second string    for (int i = 0; i < l2; i++)    {        map[str2.charAt(i) - 'a']--;         // Since lengths are same,        // some value would definitely        // become negative if result        // is false.        if (map[str2.charAt(i) - 'a'] < 0)            return false;    }     return true;} // Driver Codepublic static void main(String args[]){    String str1 = "geeksforgeeks";    String str2 = "geegeeksksfor";    if (targetstring(str1, str2))        System.out.print("YES");    else        System.out.print("NO");}} // This code is contributed by// Akanksha Rai
# Python3 program to check if# characters of one string# can be swapped to form otherMAX = 26 def targetstring(str1, str2):     l1 = len(str1)    l2 = len(str2)     # if length is not same print no    if (l1 != l2):        return False     map = [0] * MAX     # Count frequencies of character    # in first string.    for i in range (l1):        map[ord(str1[i]) - ord('a')] += 1     # iterate through the second string    # decrement counts of characters in    # second string    for i in range(l2) :        map[ord(str2[i]) - ord('a')] -= 1         # Since lengths are same, some        # value would definitely become        # negative if result is false.        if (map[ord(str2[i]) - ord('a')] < 0):            return False     return True # Driver Codeif __name__ == "__main__":     str1 = "geeksforgeeks"    str2 = "geegeeksksfor"    if (targetstring(str1, str2)):        print("YES")    else:        print("NO") # This code is contributed by ita_c
// C# program to check if// characters of one string// can be swapped to form otherusing System; class GFG{    static int MAX = 26;         static bool targetstring(string str1,                             string str2)    {        int l1 = str1.Length;        int l2 = str2.Length;             // if length is not        // same print no        if (l1 != l2)            return false;             int []map = new int[MAX];        Array.Clear(map, 0, 26);             // Count frequencies of        // character in first string.        for (int i = 0; i < l1; i++)            map[str1[i] - 'a']++;             // iterate through the second        // string decrement counts of        // characters in second string        for (int i = 0; i < l2; i++)        {            map[str2[i] - 'a']--;                 // Since lengths are same,            // some value would definitely            // become negative if result            // is false.            if (map[str2[i] - 'a'] < 0)                return false;        }             return true;    }         // Driver Code    static void Main()    {        string str1 = "geeksforgeeks";        string str2 = "geegeeksksfor";        if (targetstring(str1, str2))            Console.Write("YES");        else            Console.Write("NO");    }} // This code is contributed by// Manish Shaw(manishshaw1)
<?php// PHP program to check if// characters of one string// can be swapped to form other$MAX = 26; function targetstring($str1, $str2){    global $MAX;    $l1 = strlen($str1);    $l2 = strlen($str2);     // if length is not same print no    if ($l1 != $l2)        return false;     $map[$MAX] = array(0);     // Count frequencies of character    // in first string.    for ($i = 0; $i < $l1; $i++)        $map[$str1[$i] - 'a']++;     // iterate through the second string    // decrement counts of characters in    // second string    for ($i = 0; $i < $l2; $i++)    {        $map[$str2[$i] - 'a']--;         // Since lengths are same, some        // value would definitely become        // negative if result is false.        if ($map[$str2[$i] - 'a'] < 0)            return false;    }     return true;} // Driver Code$str1 = "geeksforgeeks";$str2 = "geegeeksksfor";if (targetstring($str1, $str2))    echo "YES";else    echo "NO"; // This code is contributed// by Akanksha Rai?>
<script>// Javascript program to check if// characters of one string// can be swapped to form otherlet MAX = 26;     function targetstring(str1,str2){    let l1 = str1.length;    let l2 = str2.length;       // if length is not same print no    if (l1 != l2)        return false;       let map = new Array(MAX);    for(let i = 0; i < map.length; i++)    {        map[i] = 0;    }           // Count frequencies of    // character in first string.    for (let i = 0; i < l1; i++)        map[str1[i].charCodeAt(0) - 'a'.charCodeAt(0)]++;       // iterate through the second    // string decrement counts of    // characters in second string    for (let i = 0; i < l2; i++)    {        map[str2[i].charCodeAt(0) - 'a'.charCodeAt(0)]--;           // Since lengths are same,        // some value would definitely        // become negative if result        // is false.        if (map[str2[i] - 'a'.charCodeAt(0)] < 0)            return false;    }     return true;} // Driver Codelet str1 = "geeksforgeeks";let str2 = "geegeeksksfor";if (targetstring(str1, str2))    document.write("YES");else    document.write("NO");         // This code is contributed by avanitrachhadiya2155</script>
YES
 
Time Complexity – O(n) 
manishshaw1
ukasp
Akanksha_Rai
avanitrachhadiya2155
frequency-counting
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Top 50 String Coding Problems for Interviews
Naive algorithm for Pattern Searching
Vigenère Cipher
Hill Cipher
How to Append a Character to a String in C
Convert character array to string in C++
Minimum changes to a string to make all substrings distinct
Converting Roman Numerals to Decimal lying between 1 to 3999
sprintf() in C
Print all subsequences of a string