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 ifAis a concatenation ofBmore than once. Find the largest string which divides bothAandB.

**Examples:**

Input:arr[] = { “GFGGFG”, “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 implemenatation 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` |

**Output:**

geeks

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

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the **Essential Maths for CP Course** at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**