Given three strings str, A and B. The task is to check whether str = A + B or str = B + A where + denotes concatenation.
Examples:
Input: str = “GeeksforGeeks”, A = “Geeksfo”, B = “rGeeks”
Output: Yes
str = A + B = “Geeksfo” + “rGeeks” = “GeeksforGeeks”
Input: str = “Delhicapitals”, B = “Delmi”, C = “capitals”
Output: No
Approach:
- If len(str) != len(A) + len(B) then it is not possible to generate str by concatenating a + b or b + a.
- Else check whether str starts with a and ends with b or it starts with b and ends with a. Print Yes if any of these is true else print No
Below is the implementation of the above approach:
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std;
// Function that return true // if pre is a prefix of str bool startsWith(string str, string pre)
{ int strLen = str.length();
int preLen = pre.length();
int i = 0, j = 0;
// While there are characters to match
while (i < strLen && j < preLen) {
// If characters differ at any position
if (str[i] != pre[j])
return false ;
i++;
j++;
}
// str starts with pre
return true ;
} // Function that return true // if suff is a suffix of str bool endsWith(string str, string suff)
{ int i = str.length() - 0;
int j = suff.length() - 0;
// While there are characters to match
while (i >= 0 && j >= 0) {
// If characters differ at any position
if (str[i] != suff[j])
return false ;
i--;
j--;
}
// str ends with suff
return true ;
} // Function that returns true // if str = a + b or str = b + a bool checkString(string str, string a, string b)
{ // str cannot be generated
// by concatenating a and b
if (str.length() != a.length() + b.length())
return false ;
// If str starts with a
// i.e. a is a prefix of str
if (startsWith(str, a)) {
// Check if the rest of the characters
// are equal to b i.e. b is a suffix of str
if (endsWith(str, b))
return true ;
}
// If str starts with b
// i.e. b is a prefix of str
if (startsWith(str, b)) {
// Check if the rest of the characters
// are equal to a i.e. a is a suffix of str
if (endsWith(str, a))
return true ;
}
return false ;
} // Driver code int main()
{ string str = "GeeksforGeeks" ;
string a = "Geeksfo" ;
string b = "rGeeks" ;
if (checkString(str, a, b))
cout << "Yes" ;
else
cout << "No" ;
return 0;
} |
// Java implementation of the approach import java.util.*;
class GFG
{ // Function that return true // if pre is a prefix of str static boolean startsWith(String str, String pre)
{ int strLen = str.length();
int preLen = pre.length();
int i = 0 , j = 0 ;
// While there are characters to match
while (i < strLen && j < preLen)
{
// If characters differ at any position
if (str.charAt(i) != pre.charAt(j))
return false ;
i++;
j++;
}
// str starts with pre
return true ;
} // Function that return true // if suff is a suffix of str static boolean endsWith(String str, String suff)
{ int i = str.length() - 1 ;
int j = suff.length() - 1 ;
// While there are characters to match
while (i >= 0 && j >= 0 )
{
// If characters differ at any position
if (str.charAt(i) != suff.charAt(j))
return false ;
i--;
j--;
}
// str ends with suff
return true ;
} // Function that returns true // if str = a + b or str = b + a static boolean checkString(String str, String a, String b)
{ // str cannot be generated
// by concatenating a and b
if (str.length() != a.length() + b.length())
return false ;
// If str starts with a
// i.e. a is a prefix of str
if (startsWith(str, a))
{
// Check if the rest of the characters
// are equal to b i.e. b is a suffix of str
if (endsWith(str, b))
return true ;
}
// If str starts with b
// i.e. b is a prefix of str
if (startsWith(str, b))
{
// Check if the rest of the characters
// are equal to a i.e. a is a suffix of str
if (endsWith(str, a))
return true ;
}
return false ;
} // Driver code public static void main(String args[])
{ String str = "GeeksforGeeks" ;
String a = "Geeksfo" ;
String b = "rGeeks" ;
if (checkString(str, a, b))
System.out.println( "Yes" );
else
System.out.println( "No" );
} } // This code is contributed by Arnab Kundu |
# Python3 implementation of the approach # Function that return true # if pre is a prefix of str def startsWith( str , pre):
strLen = len ( str )
preLen = len (pre)
i = 0
j = 0
# While there are characters to match
while (i < strLen and j < preLen):
# If characters differ at any position
if ( str [i] ! = pre[j]) :
return False
i + = 1
j + = 1
# str starts with pre
return True
# Function that return true # if suff is a suffix of str def endsWith( str , suff):
i = len ( str ) - 1
j = len (suff) - 1
# While there are characters to match
while (i > = 0 and j > = 0 ):
# If characters differ at any position
if ( str [i] ! = suff[j]):
return False
i - = 1
j - = 1
# str ends with suff
return True
# Function that returns true # if str = a + b or str = b + a def checkString( str , a, b):
# str cannot be generated
# by concatenating a and b
if ( len ( str ) ! = len (a) + len (b)):
return False
# If str starts with a
# i.e. a is a prefix of str
if (startsWith( str , a)):
# Check if the rest of the characters
# are equal to b i.e. b is a suffix of str
if (endsWith( str , b)):
return True
# If str starts with b
# i.e. b is a prefix of str
if (startsWith( str , b)):
# Check if the rest of the characters
# are equal to a i.e. a is a suffix of str
if (endsWith( str , a)):
return True
return False
# Driver code str = "GeeksforGeeks"
a = "Geeksfo"
b = "rGeeks"
if (checkString( str , a, b)):
print ( "Yes" )
else :
print ( "No" )
# This code is contributed by SHUBHAMSINGH10 |
// C# implementation of the approach using System;
class GFG
{ // Function that return true // if pre is a prefix of str static Boolean startsWith(String str,
String pre)
{ int strLen = str.Length;
int preLen = pre.Length;
int i = 0, j = 0;
// While there are characters to match
while (i < strLen && j < preLen)
{
// If characters differ at any position
if (str[i] != pre[j])
return false ;
i++;
j++;
}
// str starts with pre
return true ;
} // Function that return true // if suff is a suffix of str static Boolean endsWith(String str,
String suff)
{ int i = str.Length - 1;
int j = suff.Length - 1;
// While there are characters to match
while (i >= 0 && j >= 0)
{
// If characters differ at any position
if (str[i] != suff[j])
return false ;
i--;
j--;
}
// str ends with suff
return true ;
} // Function that returns true // if str = a + b or str = b + a static Boolean checkString(String str,
String a,
String b)
{ // str cannot be generated
// by concatenating a and b
if (str.Length != a.Length + b.Length)
return false ;
// If str starts with a
// i.e. a is a prefix of str
if (startsWith(str, a))
{
// Check if the rest of the characters
// are equal to b i.e. b is a suffix of str
if (endsWith(str, b))
return true ;
}
// If str starts with b
// i.e. b is a prefix of str
if (startsWith(str, b))
{
// Check if the rest of the characters
// are equal to a i.e. a is a suffix of str
if (endsWith(str, a))
return true ;
}
return false ;
} // Driver code public static void Main(String []args)
{ String str = "GeeksforGeeks" ;
String a = "Geeksfo" ;
String b = "rGeeks" ;
if (checkString(str, a, b))
Console.WriteLine( "Yes" );
else
Console.WriteLine( "No" );
} } // This code is contributed by 29AjayKumar |
<?php // PHP implementation of the approach // Function that return true // if pre is a prefix of str function startsWith( $str , $pre )
{ $strLen = strlen ( $str );
$preLen = strlen ( $pre );
$i = 0; $j = 0;
// While there are characters to match
while ( $i < $strLen && $j < $preLen )
{
// If characters differ at any position
if ( $str [ $i ] != $pre [ $j ])
return false;
$i ++;
$j ++;
}
// str starts with pre
return true;
} // Function that return true // if suff is a suffix of str function endsWith( $str , $suff )
{ $i = strlen ( $str )- 0;
$j = strlen ( $suff )- 0;
// While there are characters to match
while ( $i >= 0 && $j >= 0)
{
// If characters differ at any position
if ( $str [ $i ] != $suff [ $j ])
return false;
$i --;
$j --;
}
// str ends with suff
return true;
} // Function that returns true // if str = a + b or str = b + a function checkString( $str , $a , $b )
{ // str cannot be generated
// by concatenating a and b
if ( strlen ( $str ) != strlen ( $a ) + strlen ( $b ))
return false;
// If str starts with a
// i.e. a is a prefix of str
if (startsWith( $str , $a ))
{
// Check if the rest of the characters
// are equal to b i.e. b is a suffix of str
if (endsWith( $str , $b ))
return true;
}
// If str starts with b
// i.e. b is a prefix of str
if (startsWith( $str , $b ))
{
// Check if the rest of the characters
// are equal to a i.e. a is a suffix of str
if (endsWith( $str , $a ))
return true;
}
return false;
} // Driver code $str = "GeeksforGeeks" ;
$a = "Geeksfo" ;
$b = "rGeeks" ;
if (checkString( $str , $a , $b ))
echo "Yes" ;
else echo "No" ;
// This code is contributed by AnkitRai01 ?> |
<script> // JavaScript implementation of the approach
// Function that return true
// if pre is a prefix of str
function startsWith(str, pre)
{
let strLen = str.length;
let preLen = pre.length;
let i = 0, j = 0;
// While there are characters to match
while (i < strLen && j < preLen)
{
// If characters differ at any position
if (str[i] != pre[j])
return false ;
i++;
j++;
}
// str starts with pre
return true ;
}
// Function that return true
// if suff is a suffix of str
function endsWith(str, suff)
{
let i = str.length - 1;
let j = suff.length - 1;
// While there are characters to match
while (i >= 0 && j >= 0)
{
// If characters differ at any position
if (str[i] != suff[j])
return false ;
i--;
j--;
}
// str ends with suff
return true ;
}
// Function that returns true
// if str = a + b or str = b + a
function checkString(str, a, b)
{
// str cannot be generated
// by concatenating a and b
if (str.length != a.length + b.length)
return false ;
// If str starts with a
// i.e. a is a prefix of str
if (startsWith(str, a))
{
// Check if the rest of the characters
// are equal to b i.e. b is a suffix of str
if (endsWith(str, b))
return true ;
}
// If str starts with b
// i.e. b is a prefix of str
if (startsWith(str, b))
{
// Check if the rest of the characters
// are equal to a i.e. a is a suffix of str
if (endsWith(str, a))
return true ;
}
return false ;
}
let str = "GeeksforGeeks" ;
let a = "Geeksfo" ;
let b = "rGeeks" ;
if (checkString(str, a, b))
document.write( "Yes" );
else
document.write( "No" );
</script> |
Yes
Time Complexity: O(max(a,b,c)), as we are using a loop to traverse a, b, and c times. Where a, b, and c are the length of the strings.
Auxiliary Space: O(1), as we are not using any extra space.