Interleaving of two given strings with no common characters
Last Updated :
23 Jul, 2025
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.
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem