Check if substrings from three given strings can be concatenated to form a palindrome
Last Updated :
25 Jun, 2021
https://write.geeksforgeeks.org/internshipGiven three strings S1, S2, and S3 of lengths L, M, and N respectively, the task is to check if it is possible to choose some non-empty substrings from S1, S2, and S3 such that their concatenation is a palindrome. If found to be true, print “YES”. Otherwise, print “NO”.
Examples:
Input: S1 = “adcb”, S2 = “bcdb”, S3 = “ace”
Output: YES
Explanation:
One of the possible ways is as follows:
Select substring “ad” from the string S1, “d” from the string S2, and “a” from the string S3. Therefore, the resultant string is S = “adda”, which is a palindrome. Therefore, the output should be “YES”.
Input: S1 = “a”, S2 = “bc”, S3 = “c”
Output: NO
Approach: The idea is to observe that it is always possible to find such a, b, and c such that a+b+c becomes palindrome if S1 and S3 have at least one common character. Follow the below steps to solve the problem:
- Initialize two variables, say maskA and maskC, for masking the characters in the strings S1 and S3 respectively.
- Iterate over the characters of the string S1 and set (i-‘a’)th bit in maskA, indicating that the respective character is present in string S1.
- Iterate over characters of the string S3 and set (i-‘a’)th bit in maskC, indicating that the respective character is present in string S3.
- If the Bitwise AND of maskA and maskC is greater than zero, then print “YES”. Otherwise, print “NO”.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
string make_palindrome(
string S1, string S2, string S3)
{
int maskA = 0, maskC = 0;
for ( char i : S1)
maskA |= (1 << (i - 'a' ));
for ( char i : S3)
maskC |= (1 << (i - 'a' ));
if ((maskA & maskC) > 0)
return "YES" ;
return "NO" ;
}
int main()
{
string S1 = "adcb" , S2 = "bcdb" , S3 = "abe" ;
cout << make_palindrome(S1, S2, S3);
}
|
Java
import java.util.*;
class GFG
{
static String make_palindrome(
String S1, String S2, String S3)
{
int maskA = 0 , maskC = 0 ;
for ( char i : S1.toCharArray())
maskA |= ( 1 << (i - 'a' ));
for ( char i : S3.toCharArray())
maskC |= ( 1 << (i - 'a' ));
if ((maskA & maskC) > 0 )
return "YES" ;
return "NO" ;
}
public static void main(String[] args)
{
String S1 = "adcb" , S2 = "bcdb" , S3 = "abe" ;
System.out.print(make_palindrome(S1, S2, S3));
}
}
|
Python3
def make_palindrome(S1, S2, S3):
maskA, maskC = 0 , 0
for i in S1:
maskA | = ( 1 << ( ord (i) - ord ( 'a' )))
for i in S3:
maskC | = ( 1 << ( ord (i) - ord ( 'a' )))
if ((maskA & maskC) > 0 ):
return "YES"
return "NO"
if __name__ = = '__main__' :
S1,S2,S3 = "adcb" , "bcdb" , "abe"
print (make_palindrome(S1, S2, S3))
|
C#
using System;
public class GFG
{
static String make_palindrome(
String S1, String S2, String S3)
{
int maskA = 0, maskC = 0;
foreach ( char i in S1.ToCharArray())
maskA |= (1 << (i - 'a' ));
foreach ( char i in S3.ToCharArray())
maskC |= (1 << (i - 'a' ));
if ((maskA & maskC) > 0)
return "YES" ;
return "NO" ;
}
public static void Main(String[] args)
{
String S1 = "adcb" , S2 = "bcdb" , S3 = "abe" ;
Console.Write(make_palindrome(S1, S2, S3));
}
}
|
Javascript
<script>
function make_palindrome(S1,S2,S3)
{
let maskA = 0, maskC = 0;
for (let i=0;i< S1.length;i++)
maskA |= (1 << (S1[i].charCodeAt(0) - 'a' .charCodeAt(0)));
for (let i=0;i< S3.length;i++)
maskC |= (1 << (S3[i].charCodeAt(0) - 'a' .charCodeAt(0)));
if ((maskA & maskC) > 0)
return "YES" ;
return "NO" ;
}
let S1 = "adcb" , S2 = "bcdb" , S3 = "abe" ;
document.write(make_palindrome(S1, S2, S3));
</script>
|
Time Complexity: O(L + N)
Auxiliary Space: O(L + M + N)
Share your thoughts in the comments
Please Login to comment...