Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
题目来源:LeetCode-字符串轮转
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例1:
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
示例2:
输入:s1 = "aa", s2 = "aba"
输出:False
提示:
字符串长度在[0, 100000]范围内。
说明:
你能只调用一次检查子串的方法吗?
二、思路分析:
思路一:
- 判断两个字符串长度是否相等,不相等返回false
- 将第二个字符串拼接两次,如果是由第一个字符串旋转而成的,则拼接后的字符串一定会包含第一个字符串
思路二:
- 如果s2为字符串s1旋转所得,那么从s1的0下标开始,每次加入s1的下一位字符,一开始肯定是s2的字串
- 当达到一定程度时, 一定会出现不是s2字串的情况, 那么这个就是旋转点 当 i = 0 时 substringOfS1 = "w" 为 s2 = "erbottlewat" 的字串, s2.indexOf(substringOfS1) != -1
当 i = 1 时 substringOfS1 = "wa" 为 s2 = "erbottlewat" 的字串, s2.indexOf(substringOfS1) != -1
当 i = 2 时 substringOfS1 = "wat" 为 s2 = "erbottlewat" 的字串, s2.indexOf(substringOfS1) != -1
当 i = 3 时 substringOfS1 = "wate" 为 s2 = "erbottlewat" 的字串, s2.indexOf(substringOfS1) == -1
此时,i=3则为旋转点,wat是旋转后的部分,把wat和剩余的部分erbottle反过来拼接即可得到erbottlewat
三、AC 代码:
思路一:
class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1.length() != s2.length()) {
return false;
}
String doubleS2 = s2 + s2;
return doubleS2.contains(s1);
}
}
思路二:
class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1 == null && s2 == null) {
return true;
}
if (s1 == null || s2 == null) {
return false;
}
if (s1.equals(s2)) {
return true;
}
int lengthOfS1 = s1.length();
int lengthOfS2
= s2.length();
if (lengthOfS1 != lengthOfS2) {
return false;
}
int i = 0;
while (s2.indexOf(s1.substring(0, i + 1)) != -1) {
i++;
}
StringBuilder sb = new StringBuilder();
sb.append(s1, i, lengthOfS1);
sb.append(s1, 0, i);
return sb.toString().equals(s2);
}
}