Open In App

Smallest string divisible by two given strings

Last Updated : 30 Jun, 2021
Summarize
Comments
Improve
Suggest changes
Share
Like Article
Like
Report

Given two strings S and T of length N and M respectively, the task is to find the smallest string that is divisible by both the two strings. If no such string exists, then print -1.

For any two strings A and B, B divides A if and only if A is the concatenation of B at least once.

Examples:

Input: S = "abab", T = "ab"
Output: abab
Explanation: The string "abab" is the same as S and twice the concatenation of string T ("abab" = "ab" + "ab" = T + T)

Input: S = "ccc", T = "cc"
Output: cccccc
Explanation: The string "cccccc" is a concatenation of S and T twice and thrice respectively.
("cccccc" = "ccc" + "ccc" = S + S)
("cccccc" = "cc" + "cc" + "cc" = T + T + T)

Approach: The idea is based on the observation that the length of the required string, say, L, must be equal to the least common multiple of N and M. Check if string S concatenated L / N number of times is equal to string T being concatenated L / M number of times or not. If found to be true, print any one of them. Otherwise, print -1. Follow the steps below to solve the problem:

Below is the implementation of the above approach:

C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;

// Function to calculate
// GCD of two numbers
int gcd(int a, int b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}

// Function to calculate
// LCM of two numbers
int lcm(int a, int b)
{
    return (a / gcd(a, b)) * b;
}

// Function to find the smallest string
// which is divisible by strings S and T
void findSmallestString(string s, string t)
{
    // Store the length of both strings
    int n = s.length(), m = t.length();

    // Store LCM of n and m
    int l = lcm(n, m);

    // Temporary strings to store
    // concatenated strings
    string s1 = "", t1 = "";

    // Concatenate s1 (l / n) times
    for (int i = 0; i < l / n; i++) {
        s1 += s;
    }

    // Concatenate t1 (l / m) times
    for (int i = 0; i < l / m; i++) {
        t1 += t;
    }

    // If s1 and t1 are equal
    if (s1 == t1)
        cout << s1;

    // Otherwise, print -1
    else
        cout << -1;
}

// Driver Code
int main()
{
    string S = "baba", T = "ba";
    findSmallestString(S, T);

    return 0;
}
Java
// Java program for above approach
import java.io.*;

class GFG 
{

  // Function to calculate
  // GCD of two numbers
  static int gcd(int a, int b)
  {
    if (b == 0)
      return a;
    return gcd(b, a % b);
  }

  // Function to calculate
  // LCM of two numbers
  static int lcm(int a, int b)
  {
    return (a / gcd(a, b)) * b;
  }

  // Function to find the smallest string
  // which is divisible by strings S and T
  static void findSmallestString(String s, String t)
  {
    // Store the length of both strings
    int n = s.length(), m = t.length();

    // Store LCM of n and m
    int l = lcm(n, m);

    // Temporary strings to store
    // concatenated strings
    String s1 = "", t1 = "";

    // Concatenate s1 (l / n) times
    for (int i = 0; i < l / n; i++) {
      s1 += s;
    }

    // Concatenate t1 (l / m) times
    for (int i = 0; i < l / m; i++) {
      t1 += t;
    }

    // If s1 and t1 are equal
    if (s1.equals(t1)){
      System.out.println(s1);
    }

    // Otherwise, print -1
    else{
      System.out.println(-1);
    }
  }

  // Driver code
  public static void main(String[] args)
  {

    String S = "baba", T = "ba";
    findSmallestString(S, T);
  }
}

// This code is contributed by susmitakundugoaldanga.
Python3
# Python3 program for the above approach

# Function to calculate
# GCD of two numbers
def gcd(a, b):
    if (b == 0):
        return a
    return gcd(b, a % b)

# Function to calculate
# LCM of two numbers
def lcm(a, b):
    return (a // gcd(a, b)) * b

# Function to find the smallest string
# which is divisible by strings S and T
def findSmallestString(s, t):
    # Store the length of both strings
    n, m = len(s), len(t)

    # Store LCM of n and m
    l = lcm(n, m)

    # Temporary strings to store
    # concatenated strings
    s1, t1 = "", ""

    # Concatenate s1 (l / n) times
    for i in range(l//n):
        s1 += s

    # Concatenate t1 (l / m) times
    for i in range(l//m):
        t1 += t

    # If s1 and t1 are equal
    if (s1 == t1):
        print(s1)

    # Otherwise, pr-1
    else:
        print(-1)

# Driver Code
if __name__ == '__main__':
    S, T = "baba", "ba"
    findSmallestString(S, T)

# This code is contributed by mohit kumar 29.
C#
// C# program for above approach
using System;

public class GFG 
{

  // Function to calculate
  // GCD of two numbers
  static int gcd(int a, int b)
  {
    if (b == 0)
      return a;
    return gcd(b, a % b);
  }

  // Function to calculate
  // LCM of two numbers
  static int lcm(int a, int b)
  {
    return (a / gcd(a, b)) * b;
  }

  // Function to find the smallest string
  // which is divisible by strings S and T
  static void findSmallestString(string s, string t)
  {
    // Store the length of both strings
    int n = s.Length, m = t.Length;

    // Store LCM of n and m
    int l = lcm(n, m);

    // Temporary strings to store
    // concatenated strings
    string s1 = "", t1 = "";

    // Concatenate s1 (l / n) times
    for (int i = 0; i < l / n; i++) {
      s1 += s;
    }

    // Concatenate t1 (l / m) times
    for (int i = 0; i < l / m; i++) {
      t1 += t;
    }

    // If s1 and t1 are equal
    if (s1 == t1)
      Console.WriteLine(s1);

    // Otherwise, print -1
    else
      Console.WriteLine(-1);
  }

  // Driver code
  public static void Main(String[] args)
  {
    string S = "baba", T = "ba";
    findSmallestString(S, T);
  }
}

// This code is contributed by sanjoy_62.
JavaScript
<script>
// Javascript program for above approach

// Function to calculate
// GCD of two numbers
function gcd(a,b)
{
    if (b == 0)
      return a;
    return gcd(b, a % b);
}

// Function to calculate
// LCM of two numbers
function lcm(a,b)
{
    return (a / gcd(a, b)) * b;
}

// Function to find the smallest string
// which is divisible by strings S and T
function findSmallestString(s,t)
{
    // Store the length of both strings
    let n = s.length, m = t.length;
 
    // Store LCM of n and m
    let l = lcm(n, m);
 
    // Temporary strings to store
    // concatenated strings
    let s1 = "", t1 = "";
 
    // Concatenate s1 (l / n) times
    for (let i = 0; i < l / n; i++) {
      s1 += s;
    }
 
    // Concatenate t1 (l / m) times
    for (let i = 0; i < l / m; i++) {
      t1 += t;
    }
 
    // If s1 and t1 are equal
    if (s1 == (t1)){
      document.write(s1+"<br>");
    }
 
    // Otherwise, print -1
    else{
      document.write(-1+"<br>");
    }
}

 // Driver code
let  S = "baba", T = "ba";
findSmallestString(S, T);


// This code is contributed by unknown2108
</script>
 

Output: 
baba

 

Time Complexity: O(max(N, M))
Auxiliary Space: O(max(N, M))


 


Similar Reads