1.题目描述
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例1:
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
示例2:
输入:s1 = "aa", s2 = "aba"
输出:False
2.解题思路与代码
2.1 解题思路
首先判断两个字符串长度是否相同,如果不同两个字符串无论哪个旋转都不会变成另一个,直接返回false。如果相同这个时候将 s1 扩成两倍 s,即 s =s1+s1,然后在 s 上寻找字符串 s2,如果能匹配到 s2 那么 s2 必然是由 s1 旋转而成。因为拆分 s1 后的两个字符串会变成首尾相连,因此通过扩展 s1 然后匹配 s2 即可。匹配 s2 的过程可以直接调用 String 的 contains 方法,即
String s = s1 + s1;
return s.contains(s2);
也可以自己完成匹配过程,使用 s1 在字符串 s 上滑动,以 s2 长度为窗口,每滑动一次都在窗口内比较该窗口和字符串 s2 是否相同,如果相同,则返回 true,如果不同,就继续滑动该窗口比较下一组。
2.2 代码
使用 jdk 匹配
class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1.length() != s2.length()) {
return false;
}
String s = s1 + s1;
return s.contains(s2);
}
}
不使用 jdk 匹配
class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1.length() != s2.length()) {
return false;
}
if ("".equals(s1) && "".equals(s2)) {
return true;
}
String s = s1 + s1;
int index = 0;
outer:
while (index < s.length() - s2.length()) {
int idx = index;
int idx2 = 0;
while (idx2 < s2.length()) {
if (s.charAt(idx) != s2.charAt(idx2)) {
index = idx + 1;
continue outer;
} else {
idx++;
idx2++;
}
}
return true;
}
return false;
}
}
2.3 测试结果
通过测试
使用 jdk 匹配
不使用 jdk 匹配
3.总结
- 将 s1 字符串扩展一倍,然后再扩展后的字符串上匹配 s2