字符串轮转。给定两个字符串s1
和s2
,请编写代码检查s2
是否为s1
旋转而成(比如,waterbottle
是erbottlewat
旋转后的字符串)。
示例1:
输入:s1 = "waterbottle", s2 = "erbottlewat"
输出:True
示例2:
输入:s1 = "aa", s2 = "aba"
输出:False
提示:
说明:
思路:通过遍历找到s2中对于s1首字符的位置 j。然后从i, j开始依次比较,如果全部相等,则返回true,否则返回false。
(有点麻烦,可直接看下面网上的解法)
class Solution {
public:
bool isFlipedString(string s1, string s2) {
if (s1.size() != s2.size()) { return false; }
if (s1 == "" && s2 == "") { return true; }
int i = 0, j = 0, js = 0, cnt = 0;
while (js < s2.size()) {
while(s1[i] == s2[j] && cnt < s2.size()) {
i++;
j = (j + 1) % s2.size();
cnt++;
}
if (cnt == s2.size()) {
return true;
}
cnt = 0;
js += 1;
j = js;
i = 0;
}
return false;
}
};
若两个字符串可以轮转得到,则s2肯定在s1 + s1的子集内。(没想到竟然如此简洁)
class Solution {
public:
bool isFlipedString(string s1, string s2) {
return s1.size() == s2.size() && (s1+s1).find(s2) != -1;
}
};
作者:cui-tian-xiao
链接:https://leetcode-cn.com/problems/zero-matrix-lcci/solution/cjie-fa-ling-ju-zhen-9kai-pi-xin-bu-er-shu-zu-by-c/
来源:力扣(LeetCode)
查找子串应该是用的KMP算法,所以
时间复杂度: O(M+N)
空间复杂度: O(1)
跟第一次解法一致。
class Solution {
public:
bool isFlipedString(string s1, string s2) {
return s1.size() == s2.size() && (s1+s1).find(s2) != -1;
}
};
原文:https://www.cnblogs.com/phonyhao/p/14170601.html