Find the GCD of an array made up of numeric strings
Last Updated :
23 Jul, 2025
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>
Time Complexity: O(N * M), where M is the length of strings
Auxiliary Space: O(1)
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem