Open In App

Interleaving of two given strings with no common characters

Last Updated : 15 Aug, 2024
Comments
Improve
Suggest changes
Like Article
Like
Report

Given three strings s1, s2 and s3. check whether s3 is an interleaving of s1 and s2. It may be assumed that there is no common character between s1 and s2 A string s3 is said to be interleaving s1 and s2, if it contains all characters of s1 and s2 and order of all characters in individual strings is preserved.

Input: s1 = “AB”, s2 = “C”, s3 = “ACB”,
Output: true
s3 has all characters of s1 and s2 and retains order of characters in both the strings

Input: s1 = “AXY”, s2 = “BBZ”, s3 = “BBAZXY”,
Output: true
The string BBAZXY has all characters of the other two strings and in the same order.

Input: s1 = “AB”, s2 = “CD”, s3 = “ACBG”,
Output: false
D is missing in s3

Please see this for an extended solution that handles common characters also,

  • Since both the input strings have mutually exclusive characters, a character of s3 will either match with a character of s1 or s2.
  • We traverse through s3 and compare its every character with next character in s1 or next in s2. If any one matches, we move ahead in that string. If none of the two match, we return false.
  • We return true if we traversed all characters of s3 and every character matched either s1 or s2
C++
#include <bits/stdc++.h>
using namespace std;

// Returns true if s3 is an interleaving of s1 and s2
bool isIL(string& s1, string& s2, string& s3) {
  
    int i = 0, j = 0;
  
    if (s1.size() + s2.size() != s3.size())
        return false;
    
    // Iterate through all characters of s3
    for (int k = 0; k < s3.size(); k++) {
      
        // Match the current character of s3 with the 
        // current character of s1. If they match, 
        // move s1 to the next character.
        if (i < s1.size() && s1[i] == s3[k]) {
            i++;
        } 
      
        // Else match the current character of s3 
        // with the current character of s2.
        // If they match, move s2 to the next character.
        else if (j < s2.size() && s2[j] == s3[k]) {
            j++;
        } 
      
        // If it doesn't match with either s1 or s2, 
        // return false
        else {
            return false;
        }
    }
    
    // If all characters of s3 match with either
    // s1 or s2.
    return true;
}

int main() {
    string s1 = "AB";
    string s2 = "CD";
    string s3 = "ACBD";
    
    if (isIL(s1, s2, s3)) {
        cout << s3 << " is interleaved of " << s1 << " and " << s2;
    } else {
        cout << s3 << " is not interleaved of " << s1 << " and " << s2;
    }

    return 0;
}
C
// 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 false
bool 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 functions
int 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
// Java program to check if the given string is 
// an interleaving of the other two strings 
public 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
Python
# 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 false
def 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 function
A = "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#
// C# program to check if the given string is 
// an interleaving of the other two strings 
using 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
JavaScript
<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>
PHP
<?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 false
function 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
?>

Time Complexity: O(m+n) where m and n are the lengths of strings s1 and s2 respectively.
Auxiliary Space : O(1)


Note that the above approach doesn’t work if s1 and s2 have some characters in common. For example, if string s1 = “AAB”, string s2 = “AAC” and string s3 = “AACAAB”, then the above method will return false. We have discussed here an extended solution that handles common characters



Next Article
Article Tags :
Practice Tags :

Similar Reads