Interleaving of two given strings with no common characters
Last Updated :
15 Aug, 2024
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.
Similar Reads
Count common characters in two strings
Given two strings s1 and s2 consisting of lowercase English alphabets, the task is to count all the pairs of indices (i, j) from the given strings such that s1[i] = s2[j] and all the indices are distinct i.e. if s1[i] pairs with some s2[j] then these two characters will not be paired with any other
5 min read
Length of longest prefix anagram which are common in given two strings
Given two strings str1 and str2 of the lengths of N and M respectively, the task is to find the length of the longest anagram string that is prefix substring of both strings. Examples: Input: str1 = "abaabcdezzwer", str2 = "caaabbttyh"Output: 6Explanation: Prefixes of length 1 of string str1 and str
8 min read
Print all interleavings of given two strings
Given two strings str1 and str2, write a function that prints all interleavings of the given two strings. You may assume that all characters in both strings are different Example: Input: str1 = "AB", str2 = "CD"Output: ABCD ACBD ACDB CABD CADB CDABInput: str1 = "AB", str2 = "C"Output: ABC ACB CAB An
14 min read
Common characters in n strings
Given n strings, find the common characters in all the strings. In simple words, find characters that appear in all the strings and display them in alphabetical order or lexicographical order. Note* we'll be considering that the strings contain lower case letters only. Examples: Input : geeksforgeek
6 min read
Check if there is any common character in two given strings
Given two strings. The task is to check that is there any common character in between two strings. Examples: Input: s1 = "geeksforgeeks", s2 = "geeks" Output: Yes Input: s1 = "geeks", s2 = "for" Output: No Approach: Traverse the 1st string and map the characters of the string with its frequency, in
8 min read
Count the Number of matching characters in a pair of strings
Given a pair of non-empty strings str1 and str2, the task is to count the number of matching characters in these strings. Consider the single count for the character which have duplicates in the strings.Examples: Input: str1 = "abcdef", str2 = "defghia" Output: 4 Matching characters are: a, d, e, fI
7 min read
Check if a String is Interleaving of Other Two
Give three strings s1, s2 and s3, determine if s3 is formed by interleaving s1 and s2.A string s3 is an interleaving of s1 and s2 if: It contains all characters of s1 and s2 while preserving their relative order.Characters from s1 and s2 appear in s3 in the same order as in their original strings.Th
15+ min read
Split string to get maximum common characters
Given a string S of length, N. Split them into two strings such that the number of common characters between the two strings is maximized and return the maximum number of common characters. Examples: Input: N = 6, S = abccbaOutput: 3Explanation: Splitting two strings as "abc" and "cba" has at most 3
6 min read
Find two unique Palindrome Strings using given String characters
You are given a string S of two distinct characters as input, the task is to find two strings using characters of the given string, such that both strings are different from S and both should be a palindrome. Examples: Input: S = "xyyxxxx"Output: yxxxxxy, xxyxyxxExplanation: It can be verified that
15+ min read
Character pairs from two strings with even sum
Given two strings s1 and s2. The task is to take one character from first string, and one character from second string, and check if the sum of ascii values of both the character is an even number. Print the total number of such pairs. Note that both the strings consist of lowercase English alphabet
8 min read