持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情
题目描述
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例1:
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
示例2:
输入:s1 = "aa", s2 = "aba"
输出:False
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/string-rotation-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天的算法题目是判断两个字符串s1和s2, s2是否为s1旋转而成。这里旋转的意思是,将字符串s1的每一个字符从前到后逐个移动到末尾形成新的字符串。
- 比较字符串s2是否为s1旋转而成。首先需要比较的s1, s2 字符串的长度,当他们的长度不相同的时候,必然是 false。
- 当s1, s2 字符串的长度相同的时候。怎么完成 s1 的旋转呢? 直接把 s1 的字符逐个移动到尾部实现起来比较复杂!这里有一个小技巧,我们可以把两个 s1 拼接起来形成 s3, 然后使用 substring() 函数,就可以直接完成旋转的需求。
- 完成了 s1 的旋转,接下来需要和 s2 比较是否相同。我们直接使用 equals() 方法即可, 初学的朋友不要使用 == 比较。 equals() 比较是对象的内容是否相同。== 对于基本的数据类型,比较的是值是否相同。对于对象,比较的是地址是否相同。
- 具体实现代码如下,供参考。
通过代码
class Solution {
public boolean isFlipedString(String s1, String s2) {
boolean ans = false;
if (s1.length() != s2.length()) {
return ans;
}
if (s2.equals(s1)) {
ans = true;
return ans;
}
int n = s1.length();
String s3 = s1 + s1;
for (int i = 0; i < n; i++) {
String temp = s3.substring(i, i + n);
if (s2.equals(temp)) {
ans = true;
return true;
}
}
return ans;
}
}
总结
- 上述算法的时间复杂度是O(n), 空间复杂度是O(n)
- 坚持算法每日一题,加油!