Check if two strings have a common substring
Last Updated :
27 Jan, 2023
You are given two strings str1 and str2. You have to check if the two strings share a common substring.
Examples :
Input : str1 = "HELLO"
str2 = "WORLD"
Output : YES
Explanation : The substrings "O" and
"L" are common to both str1 and str2
Input : str1 = "HI"
str2 = "ALL"
Output : NO
Explanation : Because str1 and str2
have no common substrings
A basic approach runs in O(n^2), where we compare every character of string 1 with every character of string 2 and replace every matched character with a “_” and set flag variable as true.
An efficient approach works in O(n). We basically need to check if there is a common character or not. We create a vector of size 26 for alphabets and initialize them as 0. For every character in string 1 we increment vector index of that character eg: v[s1[i]-‘a’]++, for every character of string 2 we check vector for the common characters if v[s2[i]-‘a’] > 0 then set flag = true and v[s2[i]-‘a’]– such that one character of string 2 is compared with only one character of string 1.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
const int MAX_CHAR = 26;
bool twoStrings(string s1, string s2) {
vector< bool > v(MAX_CHAR, 0);
for ( int i = 0; i < s1.length(); i++)
v[s1[i] - 'a' ] = true ;
for ( int i = 0; i < s2.length(); i++)
if (v[s2[i] - 'a' ])
return true ;
return false ;
}
int main() {
string str1 = "hello" ;
string str2 = "world" ;
if (twoStrings(str1, str2))
cout << "Yes" ;
else
cout << "No" ;
return 0;
}
|
Java
import java.util.Arrays;
class GFG
{
static int MAX_CHAR = 26 ;
static boolean twoStrings(String s1, String s2)
{
boolean v[]= new boolean [MAX_CHAR];
Arrays.fill(v, false );
for ( int i = 0 ; i < s1.length(); i++)
v[s1.charAt(i) - 'a' ] = true ;
for ( int i = 0 ; i < s2.length(); i++)
if (v[s2.charAt(i) - 'a' ])
return true ;
return false ;
}
public static void main (String[] args)
{
String str1 = "hello" ;
String str2 = "world" ;
if (twoStrings(str1, str2))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
Python3
MAX_CHAR = 26
def twoStrings(s1, s2):
v = [ 0 for i in range (MAX_CHAR)]
for i in range ( len (s1)):
v[ ord (s1[i]) - ord ( 'a' )] = True
for i in range ( len (s2)):
if v[ ord (s2[i]) - ord ( 'a' )]:
return True
return False
str1 = "hello"
str2 = "world"
if twoStrings(str1, str2):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
class GFG
{
static int MAX_CHAR = 26;
static bool twoStrings(String s1, String s2)
{
bool []v = new bool [MAX_CHAR];
for ( int i = 0; i < MAX_CHAR; i++)
v[i]= false ;
for ( int i = 0; i < s1.Length; i++)
v[s1[i] - 'a' ] = true ;
for ( int i = 0; i < s2.Length; i++)
if (v[s2[i] - 'a' ])
return true ;
return false ;
}
public static void Main ()
{
String str1 = "hello" ;
String str2 = "world" ;
if (twoStrings(str1, str2))
Console.Write( "Yes" );
else
Console.Write( "No" );
}
}
|
Javascript
<script>
var MAX_CHAR = 26;
function twoStrings(s1, s2) {
var v = Array(MAX_CHAR).fill(0);
for ( var i = 0; i < s1.length; i++)
v[s1[i] - 'a' ] = true ;
for ( var i = 0; i < s2.length; i++)
if (v[s2[i] - 'a' ])
return true ;
return false ;
}
var str1 = "hello" ;
var str2 = "world" ;
if (twoStrings(str1, str2))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity : O(n)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...