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
C++
// 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
// 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
# 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#
// 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 // 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 ?> |
Javascript
<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.
Please Login to comment...