Find the GCD of an array made up of numeric strings
Given an array arr[] consisting of numeric strings, the task is to calculate Greatest Common Divisor of the given array.
Considering strings ‘A’ and ‘B’, “B divides A” if and only if A is a concatenation of B more than once. Find the largest string which divides both A and B.
Examples:
Input: arr[] = { “GFGGFG”, “GFGGFGGFGGFG” }
Output: “GFGGFG”
Explanation:
“GFGGFG” is the largest string which divides the whole array elements.Input: arr = { “Geeks”, “GFG”}
Output: “”
Approach: Follow the steps below to solve the problem:
- Calculate GCD of the length of all the strings of the given array, say GCD.
- Check if all the strings of the given array can be made by concatenating the substring {arr[0][0], .., arr[0][GCD – 1]} any number of times or not. If found to be true, then print {arr[0][0], .., arr[0][GCD – 1]}.
- Otherwise, print an empty string.
Below is the implementation of the above approach:
C++
// CPP program for the above approach #include <bits/stdc++.h> using namespace std; // Recursive function // to return gcd of A and B int GCD( int lena, int lenb) { if (lena == 0) return lenb; if (lenb == 0) return lena; // Base case if (lena == lenb) return lena; // Length of A is greater if (lena > lenb) return GCD(lena - lenb, lenb); return GCD(lena, lenb - lena); } // Calculate GCD string StringGCD(string a, string b) { // Store the GCD of the // length of the strings int gcd = GCD(a.size(), b.size()); if (a.substr(0, gcd) == b.substr(0, gcd)) { int x = (( int )b.size()/gcd); int y = (( int )a.size()/gcd); string r= "" ,s= "" ; while (x--) s += a; while (y--) r += b; if (s == r) return a.substr(0, gcd); } return "-1" ; } // Driver Code int main() { string a = "geeksgeeks" ; string b = "geeks" ; // Function call cout<<(StringGCD(a, b)); } // This code is contributed by mohit kumar 29 |
Java
// JAVA program for the above approach import java.util.*; class GFG { // Recursive function // to return gcd of A and B static int GCD( int lena, int lenb) { if (lena == 0 ) return lenb; if (lenb == 0 ) return lena; // Base case if (lena == lenb) return lena; // Length of A is greater if (lena > lenb) return GCD(lena - lenb, lenb); return GCD(lena, lenb - lena); } // Calculate GCD static String StringGCD(String a, String b) { // Store the GCD of the // length of the Strings int gcd = GCD(a.length(), b.length()); if (a.substring( 0 , gcd).equals(b.substring( 0 , gcd))) { int x = (( int )b.length()/gcd); int y = (( int )a.length()/gcd); String r= "" ,s= "" ; while (x-- > 0 ) s += a; while (y-- > 0 ) r += b; if (s.equals(r)) return a.substring( 0 , gcd); } return "-1" ; } // Driver Code public static void main(String[] args) { String a = "geeksgeeks" ; String b = "geeks" ; // Function call System.out.print(StringGCD(a, b)); } } // This code is contributed by 29AjayKumar |
Python3
# Python implementation of the above approach # Recursive function # to return gcd of A and B def GCD(lena, lenb): if (lena = = 0 ): return lenb if (lenb = = 0 ): return lena # Base case if (lena = = lenb): return lena # Length of A is greater if (lena > lenb): return GCD(lena - lenb, lenb) return GCD(lena, lenb - lena) # Calculate GCD def StringGCD(a, b): # Store the GCD of the # length of the strings gcd = GCD( len (a), len (b)) if a[:gcd] = = b[:gcd]: if a * ( len (b) / / gcd) = = b * ( len (a) / / gcd): return a[:gcd] return - 1 # Driver Code a = 'geeksgeeks' b = 'geeks' # Function call print (StringGCD(a, b)) |
C#
// C# program for the above approach using System; class GFG { // Recursive function // to return gcd of A and B static int GCD( int lena, int lenb) { if (lena == 0) return lenb; if (lenb == 0) return lena; // Base case if (lena == lenb) return lena; // Length of A is greater if (lena > lenb) return GCD(lena - lenb, lenb); return GCD(lena, lenb - lena); } // Calculate GCD static String StringGCD(String a, String b) { // Store the GCD of the // length of the Strings int gcd = GCD(a.Length, b.Length); if (a.Substring(0, gcd).Equals(b.Substring(0, gcd))) { int x = (( int )b.Length/gcd); int y = (( int )a.Length/gcd); String r= "" , s= "" ; while (x-- >0) s += a; while (y-- >0) r += b; if (s.Equals(r)) return a.Substring(0, gcd); } return "-1" ; } // Driver Code public static void Main(String[] args) { String a = "geeksgeeks" ; String b = "geeks" ; // Function call Console.Write(StringGCD(a, b)); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // JAVASCRIPT program for the above approach // Recursive function // to return gcd of A and B function GCD(lena,lenb) { if (lena == 0) return lenb; if (lenb == 0) return lena; // Base case if (lena == lenb) return lena; // Length of A is greater if (lena > lenb) return GCD(lena - lenb, lenb); return GCD(lena, lenb - lena); } // Calculate GCD function StringGCD(a,b) { // Store the GCD of the // length of the Strings let gcd = GCD(a.length, b.length); if (a.substring(0, gcd) == (b.substring(0, gcd))) { let x = Math.floor(b.length/gcd); let y = Math.floor(a.length/gcd); let r= "" ,s= "" ; while (x-- >0) s += a; while (y-- >0) r += b; if (s == (r)) return a.substring(0, gcd); } return "-1" ; } // Driver Code let a = "geeksgeeks" ; let b = "geeks" ; // Function call document.write(StringGCD(a, b)); // This code is contributed by patel2127 </script> |
Output:
geeks
Time Complexity: O(N * M), where M is the length of strings
Auxiliary Space: O(1)
Please Login to comment...