📅  最后修改于: 2023-12-03 15:32:05.488000             🧑  作者: Mango
有时候我们需要判断一个字符串是否可以通过将另一个字符串旋转2个位置来获得,本文将基于Java语言介绍如何实现这一功能。
将字符串 s
向左旋转 2 个位置,等价于把字符串 s
的前两个字符移到字符串的末尾。
我们可以将字符串 s
复制一份拼接在原字符串结尾,再截取长度为原字符串长度的子串,得到字符串 s
向左旋转 2 个位置后的新字符串 t
。
如果原字符串 s
与目标字符串 t
字符完全相同,则可以通过将字符串 s
旋转2个位置来得到目标字符串,否则不行。
以下是 Java 代码实现:
public static boolean checkRotation(String s, String t) {
if (s.length() != t.length()) {
return false;
}
String s2 = s + s;
return s2.substring(2, s.length() + 2).equals(t);
}
我们来使用单元测试来验证上述实现是否正确:
import org.junit.Test;
import static org.junit.Assert.*;
public class StringRotationTest {
@Test
public void testCheckRotation() {
assertTrue(StringRotation.checkRotation("abcd", "cdab"));
assertTrue(StringRotation.checkRotation("a", "a"));
assertFalse(StringRotation.checkRotation("abc", "acb"));
assertFalse(StringRotation.checkRotation("abc", "ab"));
assertFalse(StringRotation.checkRotation("", "a"));
}
}
执行上述测试,所有测试用例均通过。
时间复杂度:$O(n)$
因为该算法只需遍历一次原字符串 s
,把原字符串复制到新的字符串 s2
后,字符串比较只需要常数时间,所以时间复杂度为 $O(n)$。