Check whether given string can be generated after concatenating given strings
Last Updated :
12 Oct, 2022
Improve
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>
Output:
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.