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

• Last Updated : 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 = {0};
for i=0 to l1
map[str1[i]-'a']++;
for i=0 to l2
map[str2[i]-'a']--;
if (map[str-'a'<0)
print "NO"
4- if no index goes negative print "YES"
5- End

C++

 #include 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

 // 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

 # 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 =  * 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#

 // 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)



Javascript


Output:
YES

Time Complexity – O(n)

My Personal Notes arrow_drop_up