Open In App

Number of common base strings for two strings

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  




// CPP program to count common base strings
// of s1 and s2.
#include <bits/stdc++.h>
using namespace std;
 
// function for finding common divisor .
bool isCommonBase(string base, string s1, 
                               string s2)
{
    // Checking if 'base' is base string 
    // of 's1'
    for (int j = 0; j < s1.length(); ++j)
        if (base[j % base.length()] != s1[j])
            return false;
     
    // Checking if 'base' is base string
    // of 's2'
    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;
}
 
// Driver code
int main()
{
    string s1 = "pqrspqrs";
    string s2 = "pqrspqrspqrspqrs";
    cout << countCommonBases(s1, s2) << endl;
    return 0;
}




// Java program to count common
// base strings of s1 and s2.
 
class GFG
{
 
// function for finding common divisor
static boolean isCommonBase(String base,
                            String s1,
                            String s2)
{
    // Checking if 'base' is base
    // String of 's1'
    for (int j = 0; j < s1.length(); ++j)
    {
        if (base.charAt(j %
            base.length()) != s1.charAt(j))
        {
            return false;
        }
    }
 
    // Checking if 'base' is base
    // String of 's2'
    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;
}
 
// Driver code
public static void main(String[] args)
{
    String s1 = "pqrspqrs";
    String s2 = "pqrspqrspqrspqrs";
 
    System.out.println(countCommonBases(s1, s2));
}
}
 
// This code is contributed by Rajput-JI




# Python 3 program to count common
# base strings of s1 and s2.
 
# function for finding common divisor .
def isCommonBase(base, s1, s2):
 
    # Checking if 'base' is base
    # string of 's1'
    for j in range(len(s1)):
        if (base[j % len(base)] != s1[j]):
            return False
     
    # Checking if 'base' is base
    # string of 's2'
    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
 
# Driver code
if __name__ == "__main__":
     
    s1 = "pqrspqrs"
    s2 = "pqrspqrspqrspqrs"
    print(countCommonBases(s1, s2))
 
# This code is contributed by ita_c




// C# program to count common base
// strings of s1 and s2.
using System;
 
class GFG
{
// function for finding common divisor
static bool isCommonBase(String Base,
                         String s1,
                         String s2)
{
    // Checking if 'base' is base
    // String of 's1'
    for (int j = 0; j < s1.Length; ++j)
    {
        if (Base[j % Base.Length] != s1[j])
        {
            return false;
        }
    }
 
    // Checking if 'base' is base
    // String of 's2'
    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;
}
 
// Driver code
public static void Main()
{
    String s1 = "pqrspqrs";
    String s2 = "pqrspqrspqrspqrs";
 
    Console.Write(countCommonBases(s1, s2));
}
}
 
// This code is contributed by Rajput-JI




<?php
// PHP program to count common base strings
// of s1 and s2.
 
// function for finding common divisor .
function isCommonBase($base,$s1, $s2)
{
    // Checking if 'base' is base string
    // of 's1'
    for ($j = 0; $j < strlen($s1); ++$j)
        if ($base[$j % strlen($base)] != $s1[$j])
            return false;
     
    // Checking if 'base' is base string
    // of 's2'
    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;
}
 
// Driver code
    $s1 = "pqrspqrs";
    $s2 = "pqrspqrspqrspqrs";
    echo countCommonBases($s1, $s2)."\n";
 
// This code is contributed by mits
?>




<script>
// Javascript program to count common
// base strings of s1 and s2.
     
    // function for finding common divisor
    function isCommonBase(base,s1,s2)
    {
     
        // Checking if 'base' is base
    // String of 's1'
    for (let j = 0; j < s1.length; ++j)
    {
        if (base[j % base.length] != s1[j])
        {
            return false;
        }
    }
   
    // Checking if 'base' is base
    // String of 's2'
    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;
    }
     
    // Driver code
    let s1 = "pqrspqrs";
    let s2 = "pqrspqrspqrspqrs";
    document.write(countCommonBases(s1, s2));
             
    // This code is contributed by rag2127
</script>

Output
2

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.


Article Tags :