如果字符串s中的字符循环移动任意位置之后能够得到另一字符串t,那么s就被称为t的回环变位。例如,ACTGACG 就是 TGACGAC 的一个回环变位,反之亦然。判定这个条件在基因组序列中的研究是十分重要的。编写一个算法检查两个给定的字符串s和t是否互为回环变位。
这是我在《算法(第四版)》里看到的一道练习题 ,当时的第一想法就是遍历字符串 t,从不同的索引位置将字符串t分解成两个子串,交换顺序拼接后再与s相比是否相等。算法如下:
public static boolean isCircularRotation(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int length = s.length();
for (int i = 1; i <= length; i++) {
String left = s.substring(0, i);
String right = s.substring(i, length);
if ((right + left).equals(t)) {
return true;
}
}
return false;
}
后来看答案,提示说可以用一行代码就能搞定了。当时想了想,感觉不太可能,就作罢了。今天重新开始学习这本书的时候,再次看到这道题,突然有了想法︿( ̄︶ ̄)︿。代码如下:
public static boolean isCircularRotation(String s, String t) {
return s.length() == t.length() && (t + t).contains(s);
}
解释:如果字符串s和t互为回环变位,则s可分解为“AB”,t可分解为“BA”。那么t与自身拼接后则为“BABA”,显然是会包含s的。这种思路比较巧妙,当然了,自认为算法效率并没有什么提高。