Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine the smallest common divisor of a string?

I was asked the following question during a job interview and was stumped by it.

Part of the problem I had is making up my mind about what problem I was solving. At first I didn't think the question was internally consistent but then I realized it is asking you to solve two different things - the first task is to figure out whether one string contains a multiple of another string. But the second task is to find a smaller unit of division within both strings.

It's a bit more clear to me now with the pressure of the interview room behind me but I'm still not sure what the ideal algorithm would be here. Any suggestions?

Given two strings s & t, determine if s is divisible by t.
For example: "abab" is divisible by "ab"
But "ababab" is not divisible by "abab".
If it isn't divisible, return -1.
If it is, return the length of the smallest common divisor:
So, for "abababab" and "abab", return 2 as s is divisible 
by t and the smallest common divisor is "ab" with length 2.
like image 963
Bob Avatar asked Oct 16 '22 07:10

Bob


1 Answers

Oddly, you're asked to return -1 unless s is divisible by t (which is easy to check), and then you're only left with cases where t divides s.

If t divides s, then the smallest common divisor is just the smallest divisor of t.

The simplest way to find the smallest divisor of t is to check all the factors of its length to see if the prefix of that length divides t.

You can do it in linear time by building the Knuth-Morris-Pratt search table for t: https://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm

This will tell you all the suffixes of t that are also prefixes of t. If the length of the remainder divides the length of t, then the remainder divides t.

like image 141
Matt Timmermans Avatar answered Oct 19 '22 23:10

Matt Timmermans