Open In App

Find the GCD of an array made up of numeric strings

Improve
Improve
Like Article
Like
Save
Share
Report

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)



Last Updated : 25 Aug, 2021
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads