Interview question: Check if one string is a rotation of other string
First make sure s1
and s2
are of the same length. Then check to see if s2
is a substring of s1
concatenated with s1
:
algorithm checkRotation(string s1, string s2)
if( len(s1) != len(s2))
return false
if( substring(s2,concat(s1,s1))
return true
return false
end
In Java:
boolean isRotation(String s1,String s2) {
return (s1.length() == s2.length()) && ((s1+s1).indexOf(s2) != -1);
}
How to generalize my algorithm to detect if one string is a rotation of another
Let suppose the first string is S and the second is S', clearly if they have different length then we output they are not a rotation of each other. Create a string S''=SS. In fact concatenation of S to itself. Then if S,S' are rotation of each other we find a substring S' in S'' by KMP Algorithm in O(n)
, otherwise we output they are not a rotation of each other. BTW if you are looking for a fast practical algorithm then instead of KMP use Boyer Moore algorithm.
To address the question more explicit, I'd say that I don't expect an easy algorithm for this special case of string matching problem. So having this background in mind, I don't think an easy modification on your algorithm can work. In fact the field of string matching algorithms is very well developed. If there is a somewhat simpler algorithm than sth like KMP or suffix tree based algorithms, for this special case, then still I think studying those general algorithms can help.
Language Independant: Check if a string consists of a multiple of a certain substring
A Python solution inspired by https://stackoverflow.com/a/2553533/1763356 is
s in (s + s)[1:-1]
This takes O(n)
time assuming an efficient implementation of str.__contains__
.
How do I check if a string is entirely made of the same substring?
There’s a nifty little theorem about strings like these.
A string consists of the same pattern repeated multiple times if and only if the string is a nontrivial rotation of itself.
Here, a rotation means deleting some number of characters from the front of the string and moving them to the back. For example, the string hello
could be rotated to form any of these strings:
hello (the trivial rotation)
elloh
llohe
lohel
ohell
To see why this works, first, assume that a string consists of k repeated copies of a string w. Then deleting the first copy of the repeated pattern (w) from the front of the string and tacking it onto the back will give back the same string. The reverse direction is a bit trickier to prove, but the idea is that if you rotate a string and get back what you started with, you can apply that rotation repeatedly to tile the string with multiple copies of the same pattern (that pattern being the string you needed to move to the end to do the rotation).
Now the question is how to check whether this is the case. For that, there’s another beautiful theorem we can use:
If x and y are strings of the same length, then x is a rotation of y if and only if x is a substring of yy.
As an example, we can see that lohel
is a rotation of hello
as follows:
hellohello
^^^^^
In our case, we know that every string x will always be a substring of xx (it’ll appear twice, once at each copy of x). So basically we just need to check if our string x is a substring of xx without allowing it to match at the first or halfway character. Here’s a one-liner for that:
function check(str) {
return (str + str).indexOf(str, 1) !== str.length;
}
Assuming indexOf
is implemented using a fast string matching algorithm, this will run in time O(n), where n is the length of the input string.
Hope this helps!
Related Topics
How to Get Vm Arguments from Inside of Java Application
Copying Files from One Directory to Another in Java
Parsing Iso-8601 Datetime with Offset with Colon in Java
Using Sleep() for a Single Thread
Main Thread VS. UI Thread in Java
Java - How to Find the Redirected Url of a Url
How to Read Integer Value from the Standard Input in Java
Simpledateformat and Locale Based Format String
How to Parse a JSON and Turn Its Values into an Array
Border with Rounded Corners & Transparency
Java Random Numbers Using a Seed
How to Convert Outputstream to Inputstream
Differencebetween Method Overloading and Overriding
How to Get a Unique Computer Identifier in Java (Like Disk Id or Motherboard Id)
Loading Images from Jars for Swing HTML
How to Store Date/Time and Timestamps in Utc Time Zone with JPA and Hibernate