# Find the GCD of an array made up of numeric strings

• Last Updated : 25 Aug, 2021

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 ``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

 ``

Output:

`geeks`

Time Complexity: O(N * M), where M is the length of strings
Auxiliary Space: O(1)

My Personal Notes arrow_drop_up