Interleaving of two given strings with no common characters - GeeksforGeeks

17 Jan, 2022
Given three strings A, B and C. Write a function that checks whether C is an interleaving of A and B. It may be assumed that there is no common character between A and B (Please see this for an extended solution that handles common characters also), C is said to be interleaving A and B, if it contains all characters of A and B and order of all characters in individual strings is preserved. See previous post for examples.Solution: Pick each character of C one by one and match it with the first character in A. If it doesn’t match then match it with first character of B. If it doesn’t even match first character of B, then return false. If the character matches with first character of A, then repeat the above process from second character of C, second character of A and first character of B. If first character of C matches with the first character of B (and doesn’t match the first character of A), then repeat the above process from the second character of C, first character of A and second character of B. If all characters of C match either with a character of A or a character of B and length of C is sum of lengths of A and B, then C is an interleaving A and B.  
C++
C
Java
Python3
C#
PHP
Javascript
// C++ program to check if given string is// an interleaving of the other two strings#include <bits/stdc++.h>using namespace std; // Returns true if C is an interleaving of A and B,// otherwise returns falsebool isInterleaved (char A[], char B[], char C[]){    // Iterate through all characters of C.    while (*C != 0)    {        // Match first character of C with first character        // of A. If matches them move A to next        if (*A == *C)            A++;         // Else Match first character of C with first        // character of B. If matches them move B to next        else if (*B == *C)            B++;         // If doesn't match with either A or B, then return        // false        else            return false;                 // Move C to next for next iteration        C++;    }     // If A or B still have some characters, then length of    // C is smaller than sum of lengths of A and B, so    // return false    if (*A || *B)        return false;     return true;} // Driver program to test above functionsint main(){    char A[] = "AB";    char B[] = "CD";    char C[] = "ACBG";    if (isInterleaved(A, B, C) == true)        cout << C << " is interleaved of " << A << " and " << B;    else        cout << C << " is not interleaved of " << A << " and " << B;     return 0;} // This is code is contributed by rathbhupendra
// C program to check if given string is an interleaving// of the other two strings#include<stdio.h> // Returns true if C is an interleaving of A and B,// otherwise returns falsebool isInterleaved (char *A, char *B, char *C){    // Iterate through all characters of C.    while (*C != 0)    {        // Match first character of C with first character        // of A. If matches them move A to next        if (*A == *C)            A++;         // Else Match first character of C with first        // character of B. If matches them move B to next        else if (*B == *C)            B++;          // If doesn't match with either A or B, then return        // false        else            return false;                 // Move C to next for next iteration        C++;    }     // If A or B still have some characters, then length of    // C  is smaller than sum of lengths of A and B, so    // return false    if (*A || *B)        return false;     return true;} // Driver program to test above functionsint main(){    char *A = "AB";    char *B = "CD";    char *C = "ACBG";    if (isInterleaved(A, B, C) == true)        printf("%s is interleaved of %s and %s", C, A, B);    else        printf("%s is not interleaved of %s and %s", C, A, B);     return 0;} // This code is contributed by Venkat
// Java program to check if the given string is// an interleaving of the other two stringspublic class GfG{     // Returns true if C is an interleaving    // of A and B, otherwise returns false    static boolean isInterleaved (String A, String B, String C)    {        int i = 0, j = 0, k = 0;                 // Iterate through all characters of C.        while (k != C.length())        {            // Match first character of C with first character            // of A. If matches them move A to next            if (i<A.length()&&A.charAt(i) == C.charAt(k))                i++;                 // Else Match first character of C with first            // character of B. If matches them move B to next            else if (j<B.length()&&B.charAt(j) == C.charAt(k))                j++;                 // If doesn't match with either A or B, then return            // false            else                return false;                         // Move C to next for next iteration            k++;        }             // If A or B still have some characters,        // then length of C is smaller than sum        // of lengths of A and B, so return false        if (i < A.length() || j < B.length())            return false;             return true;    }     public static void main(String []args){                 String A = "AB";        String B = "CD";        String C = "ACBG";        if (isInterleaved(A, B, C) == true)            System.out.printf("%s is interleaved of %s and %s", C, A, B);        else            System.out.printf("%s is not interleaved of %s and %s", C, A, B);    }} // This code is contributed by Rituraj Jain
# Python3 program to check if given string is an interleaving of# the other two strings # Returns true if C is an interleaving of A and B, otherwise# returns falsedef isInterleaved(A, B, C):     # Utility variables    i = 0    j = 0    k = 0     # Iterate through all characters of C.    while k != len(C)-1:         # Match first character of C with first character of A,        # If matches them move A to next        if i<len(A) and A[i] == C[k]:            i+=1         # Else Match first character of C with first character        # of B. If matches them move B to next        elif j< len(B) and B[j] == C[k]:            j+=1         # If doesn't match with either A or B, then return false        else:            return 0         # Move C to next for next iteration        k+=1     # If A or B still have some characters, then length of C is    # smaller than sum of lengths of A and B, so return false    if A[i-1] or B[j-1]:        return 0     return 1 # Driver program to test the above functionA = "AB"B = "CD"C = "ACBG"if isInterleaved(A, B, C) == 1:    print (C + " is interleaved of " + A + " and " + B)else:    print (C + " is not interleaved of " + A + " and " + B) # This code is contributed by Bhavya Jain
// C# program to check if the given string is// an interleaving of the other two stringsusing System; class GfG{     // Returns true if C is an interleaving    // of A and B, otherwise returns false    static bool isInterleaved (String A, String B, String C)    {        int i = 0, j = 0, k = 0;                 // Iterate through all characters of C.        while (k != C.Length - 1)        {            // Match first character of C with first character            // of A. If matches them move A to next            if (A[i] == C[k])                i++;                 // Else Match first character of C with first            // character of B. If matches them move B to next            else if (B[j] == C[k])                j++;                 // If doesn't match with either A or B, then return            // false            else                return false;                         // Move C to next for next iteration            k++;        }             // If A or B still have some characters,        // then length of C is smaller than sum        // of lengths of A and B, so return false        if (i < A.Length || j < B.Length)            return false;             return true;    }     // Driver code    public static void Main(String []args)    {                 String A = "AB";        String B = "CD";        String C = "ACBG";        if (isInterleaved(A, B, C) == true)            Console.WriteLine("{0} is interleaved of {1} and {2}", C, A, B);        else            Console.WriteLine("{0} is not interleaved of {1} and {2}", C, A, B);    }} // This code contributed by Rajput-Ji
<?php// PHP program to check if given string// is an interleaving of the other two strings // Returns true if C is an interleaving// of A and B, otherwise returns falsefunction isInterleaved ($A, $B, $C){    // Iterate through all characters of C.    while ($C != 0)    {        // Match first character of C with        // first character of A. If matches        // them move A to next        if ($A == $C)            $A++;         // Else Match first character of C        // with first character of B. If        // matches them move B to next        else if ($B == $C)            $B++;         // If doesn't match with either        // A or B, then return false        else            return false;                 // Move C to next for next iteration        $C++;    }     // If A or B still have some characters,    // then length of C is smaller than sum    // of lengths of A and B, so return false    if ($A || $B)        return false;     return true;} // Driver Code$A = "AB";$B = "CD";$C = "ACBG";if (isInterleaved($A, $B, $C) == true)    echo $C . " is interleaved of " .         $A . " and " . $B;else    echo $C . " is not interleaved of " .         $A . " and " . $B; // This code is contributed by ita_c?>
<script>// Javascript program to check if the given string is // an interleaving of the other two strings          // Returns true if C is an interleaving     // of A and B, otherwise returns false     function isInterleaved (A,B,C)    {        let i = 0, j = 0, k = 0;                 // Iterate through all characters of C.         while (k != C.length)        {                     // Match first character of C with first character             // of A. If matches them move A to next             if (i<A.length && A[i] == C[k])            {                i++;            }                         // Else Match first character of C with first             // character of B. If matches them move B to next            else if (j < B.length && B[j] == C[k])            {                j++;             }                         // If doesn't match with either A or B, then return             // false             else            {                return false;            }                         // Move C to next for next iteration            k++;        }                 // If A or B still have some characters,         // then length of C is smaller than sum         // of lengths of A and B, so return false        if (i < A.length || j < B.length)        {            return false;        }        return true;     }         let A = "AB";    let B = "CD";     let C = "ACBG";    if (isInterleaved(A, B, C) == true)    {        document.write(C+ " is interleaved of "+ A+" and ", B);     }    else    {        document.write(C + " is not interleaved of "+ A +" and ", B);    }         // This code is contributed by avanitrachhadiya2155</script>
Output:  
  ACBG is not interleaved of AB and CD
Time Complexity: O(m+n) where m and n are the lengths of strings A and B respectively.Note that the above approach doesn’t work if A and B have some characters in common. For example, if string A = “AAB”, string B = “AAC” and string C = “AACAAB”, then the above method will return false. We have discussed here an extended solution that handles common characters.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
ukasp
rituraj_jain
Rajput-Ji
rathbhupendra
Mahesh Vangala
Vignesh Muralidharan
avanitrachhadiya2155
amartyaghoshgfg
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Check for Balanced Brackets in an expression (well-formedness) using Stack
Python program to check if a string is palindrome or not
KMP Algorithm for Pattern Searching
Different methods to reverse a string in C/C++
Array of Strings in C++ (5 Different Ways to Create)
Convert string to char array in C++
Check whether two strings are anagram of each other
Longest Palindromic Substring | Set 1
Caesar Cipher in Cryptography
Top 50 String Coding Problems for Interviews