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



filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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 
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

<?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
?>
chevron_right

Output:
2

Time Complexity : O(min(n1, n2) * (n1 + n2))

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




Article Tags :
Practice Tags :