[LeetCode]面试题 01.09. 字符串轮转
作者:互联网
题目描述
难度 简单
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。
示例1:
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
示例2:
输入:s1 = "aa", s2 = "aba"
输出:False
提示:
字符串长度在[0, 100000]范围内。
说明:
你能只调用一次检查子串的方法吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-rotation-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
解法一:%运算符具有轮转性质,穷举比对拼接的字符与s2是否相等,时间复杂度O(N^2+M)。
解法二:巧妙的思路,判断s2+s2是否包含s1。因为s1不管如何轮转都可以在s2+s2组合的串内中找到,假如s1在s2+s2组合串范围内找不到,则表示s1是错误的字符串。
代码实现
解法一:
class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1.length() > 100000 || s2.length() > 100000 || s1.length() != s2.length())
return false;
if (s1.equals("") && s2.equals(""))
return true;
char[] s1chars = s1.toCharArray();
//轮转拼接s1chars子串,检查是否与s2相等
//%运算符具有轮转性质
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < s1chars.length; i++) {//最大轮转次数
int index = 0;
while (index < s1chars.length) {
stringBuilder.append(s1chars[(index + i) % s1chars.length]);
index++;
}
if (stringBuilder.toString().equals(s2))
return true;
stringBuilder.delete(0, s1chars.length);
}
return false;
}
}
执行结果:通过
执行用时:903 ms, 在所有 Java 提交中击败了5.14% 的用户
内存消耗:39 MB, 在所有 Java 提交中击败了5.19% 的用户
通过测试用例:30 / 30
2021年 11月 14日 星期日 05:31:26 CST
解法二:
class Solution {
public boolean isFlipedString(String s1, String s2) {
if (s1.length() > 100000 || s2.length() > 100000 || s1.length() != s2.length())
return false;
return (s2 + s2).contains(s1);
}
}
执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:37.8 MB, 在所有 Java 提交中击败了95.49% 的用户
通过测试用例:30 / 30
2021年 11月 14日 星期日 05:47:35 CST
标签:面试题,轮转,s2,s1,return,s1chars,length,01.09,LeetCode 来源: https://blog.csdn.net/u014132947/article/details/121313481