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++
#include <bits/stdc++.h>
using namespace std;
bool isInterleaved ( char A[], char B[], char C[])
{
while (*C != 0)
{
if (*A == *C)
A++;
else if (*B == *C)
B++;
else
return false ;
C++;
}
if (*A || *B)
return false ;
return true ;
}
int 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;
}
|
C
#include<stdio.h>
bool isInterleaved ( char *A, char *B, char *C)
{
while (*C != 0)
{
if (*A == *C)
A++;
else if (*B == *C)
B++;
else
return false ;
C++;
}
if (*A || *B)
return false ;
return true ;
}
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;
}
|
Java
public class GfG{
static boolean isInterleaved (String A, String B, String C)
{
int i = 0 , j = 0 , k = 0 ;
while (k != C.length())
{
if (i<A.length()&&A.charAt(i) == C.charAt(k))
i++;
else if (j<B.length()&&B.charAt(j) == C.charAt(k))
j++;
else
return false ;
k++;
}
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);
}
}
|
Python3
def isInterleaved(A, B, C):
i = 0
j = 0
k = 0
while k ! = len (C) - 1 :
if i< len (A) and A[i] = = C[k]:
i + = 1
elif j< len (B) and B[j] = = C[k]:
j + = 1
else :
return 0
k + = 1
if A[i - 1 ] or B[j - 1 ]:
return 0
return 1
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)
|
C#
using System;
class GfG
{
static bool isInterleaved (String A, String B, String C)
{
int i = 0, j = 0, k = 0;
while (k != C.Length - 1)
{
if (A[i] == C[k])
i++;
else if (B[j] == C[k])
j++;
else
return false ;
k++;
}
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 )
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);
}
}
|
PHP
<?php
function isInterleaved ( $A , $B , $C )
{
while ( $C != 0)
{
if ( $A == $C )
$A ++;
else if ( $B == $C )
$B ++;
else
return false;
$C ++;
}
if ( $A || $B )
return false;
return true;
}
$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 ;
?>
|
Javascript
<script>
function isInterleaved (A,B,C)
{
let i = 0, j = 0, k = 0;
while (k != C.length)
{
if (i<A.length && A[i] == C[k])
{
i++;
}
else if (j < B.length && B[j] == C[k])
{
j++;
}
else
{
return false ;
}
k++;
}
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);
}
</script>
|
OutputACBG 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.