我的一个朋友今天在面试中被问到以下问题,询问软件开发人员的职位:
给定两个字符串s1,s2您将如何检查是否s1为的 旋转 版本s2?
s1
s2
例:
如果是,s1 = "stackoverflow"那么以下是其一些轮换版本:
s1 = "stackoverflow"
"tackoverflows" "ackoverflowst" "overflowstack"
其中,作为"stackoverflwo"是 不 旋转的版本。
"stackoverflwo"
他给出的答案是:
取s2,发现为子串最长前缀s1,这将使你的旋转点。找到该点后,s2在该点断开以获取s2a和s2b,然后检查是否concatenate(s2a,s2b) == s1
s2a
s2b
concatenate(s2a,s2b) == s1
对于我和我的朋友来说,这似乎是一个很好的解决方案。但是面试官却不这么认为。他要求一个更简单的解决方案。请告诉我您将如何做来帮助我Java/C/C++?
Java/C/C++
提前致谢。
首先确保s1和s2的长度相同。然后检查是否s2是一个s1与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
在Java中:
boolean isRotation(String s1,String s2) { return (s1.length() == s2.length()) && ((s1+s1).indexOf(s2) != -1); }