Given two strings s1 and s2, we need to find number of common base strings of two. A substring of a string s is called base string if repeated concatenation of the substring results in s.
Examples:
Input : s1 = "pqrspqrs"
s2 = "pqrspqrspqrspqrs"
Output : 2
The two common base strings are "pqrs"
and "pqrspqrs".
Input: s1 = "bbb"
s2 = "bb"
Output: 1
There is only one common base string
which is "b".
The maximum possible length of common base string is equal to length of smaller of two strings. So we run a loop that considers all prefixes of smaller string and for every prefix checks if it is a common base.
Below is the implementation of the following approach
C++
#include <bits/stdc++.h>
using namespace std;
bool isCommonBase(string base, string s1,
string s2)
{
for ( int j = 0; j < s1.length(); ++j)
if (base[j % base.length()] != s1[j])
return false ;
for ( int j = 0; j < s2.length(); ++j)
if (base[j % base.length()] != s2[j])
return false ;
return true ;
}
int countCommonBases(string s1, string s2) {
int n1 = s1.length(), n2 = s2.length();
int count = 0;
for ( int i=1; i<=min(n1, n2); i++)
{
string base = s1.substr(0, i);
if (isCommonBase(base, s1, s2))
count++;
}
return count;
}
int main()
{
string s1 = "pqrspqrs" ;
string s2 = "pqrspqrspqrspqrs" ;
cout << countCommonBases(s1, s2) << endl;
return 0;
}
|
Java
class GFG
{
static boolean isCommonBase(String base,
String s1,
String s2)
{
for ( int j = 0 ; j < s1.length(); ++j)
{
if (base.charAt(j %
base.length()) != s1.charAt(j))
{
return false ;
}
}
for ( int j = 0 ; j < s2.length(); ++j)
{
if (base.charAt(j %
base.length()) != s2.charAt(j))
{
return false ;
}
}
return true ;
}
static int countCommonBases(String s1,
String s2)
{
int n1 = s1.length(),
n2 = s2.length();
int count = 0 ;
for ( int i = 1 ; i <= Math.min(n1, n2); i++)
{
String base = s1.substring( 0 , i);
if (isCommonBase(base, s1, s2))
{
count++;
}
}
return count;
}
public static void main(String[] args)
{
String s1 = "pqrspqrs" ;
String s2 = "pqrspqrspqrspqrs" ;
System.out.println(countCommonBases(s1, s2));
}
}
|
Python 3
def isCommonBase(base, s1, s2):
for j in range ( len (s1)):
if (base[j % len (base)] ! = s1[j]):
return False
for j in range ( len (s2)):
if (base[j % len ( base)] ! = s2[j]):
return False
return True
def countCommonBases(s1, s2):
n1 = len (s1)
n2 = len (s2)
count = 0
for i in range ( 1 , min (n1, n2) + 1 ):
base = s1[ 0 : i]
if (isCommonBase(base, s1, s2)):
count + = 1
return count
if __name__ = = "__main__" :
s1 = "pqrspqrs"
s2 = "pqrspqrspqrspqrs"
print (countCommonBases(s1, s2))
|
C#
using System;
class GFG
{
static bool isCommonBase(String Base,
String s1,
String s2)
{
for ( int j = 0; j < s1.Length; ++j)
{
if (Base[j % Base.Length] != s1[j])
{
return false ;
}
}
for ( int j = 0; j < s2.Length; ++j)
{
if (Base[j % Base.Length] != s2[j])
{
return false ;
}
}
return true ;
}
static int countCommonBases(String s1,
String s2)
{
int n1 = s1.Length, n2 = s2.Length;
int count = 0;
for ( int i = 1;
i <= Math.Min(n1, n2); i++)
{
String Base = s1.Substring(0, i);
if (isCommonBase(Base, s1, s2))
{
count++;
}
}
return count;
}
public static void Main()
{
String s1 = "pqrspqrs" ;
String s2 = "pqrspqrspqrspqrs" ;
Console.Write(countCommonBases(s1, s2));
}
}
|
PHP
<?php
function isCommonBase( $base , $s1 , $s2 )
{
for ( $j = 0; $j < strlen ( $s1 ); ++ $j )
if ( $base [ $j % strlen ( $base )] != $s1 [ $j ])
return false;
for ( $j = 0; $j < strlen ( $s2 ); ++ $j )
if ( $base [ $j % strlen ( $base )] != $s2 [ $j ])
return false;
return true;
}
function countCommonBases( $s1 , $s2 )
{
$n1 = strlen ( $s1 );
$n2 = strlen ( $s2 );
$count = 0;
for ( $i = 1; $i <= min( $n1 , $n2 ); $i ++)
{
$base = substr ( $s1 ,0, $i );
if (isCommonBase( $base , $s1 , $s2 ))
$count ++;
}
return $count ;
}
$s1 = "pqrspqrs" ;
$s2 = "pqrspqrspqrspqrs" ;
echo countCommonBases( $s1 , $s2 ). "\n" ;
?>
|
Javascript
<script>
function isCommonBase(base,s1,s2)
{
for (let j = 0; j < s1.length; ++j)
{
if (base[j % base.length] != s1[j])
{
return false ;
}
}
for (let j = 0; j < s2.length; ++j)
{
if (base[j %base.length] != s2[j])
{
return false ;
}
}
return true ;
}
function countCommonBases(s1,s2)
{
let n1 = s1.length,
n2 = s2.length;
let count = 0;
for (let i = 1; i <= Math.min(n1, n2); i++)
{
let base = s1.substring(0, i);
if (isCommonBase(base, s1, s2))
{
count++;
}
}
return count;
}
let s1 = "pqrspqrs" ;
let s2 = "pqrspqrspqrspqrs" ;
document.write(countCommonBases(s1, s2));
</script>
|
Time Complexity: O(min(n1, n2) * (n1 + n2))
Auxiliary Space: O(min(n1, n2)), where n1 and n2 are the lengths of the given strings.