思路:
题目的主要信息:
- 对A任意位置切割,调转前后连接(即右边部分拼到左边前面),查看与B是否相等
- AB都不为空,不用判断特殊情况
方法一:暴力求解
具体做法:
遍历A数组,每次利用string的substr函数从0到 i 截取前半部分,将其后半部分连在前面,再与B比较。
class Solution {
public:
bool solve(string A, string B) {
if(A == B) //如果A=B直接不用旋转
return true;
for(int i = 0; i < A.length() - 1; i++){
string temp = "";
temp = A.substr(i + 1) + A.substr(0, i + 1); //截取后半部分与前半部分相连
if(temp == B)
return true;
}
return false;
}
};
复杂度分析:
- 时间复杂度:O(n2),n为字符串A的大小,一次遍历,每次比较复杂度为O(n)
- 空间复杂度:O(n),临时字符串保存A的旋转后结果
方法二:判断是否为子串
具体做法:
方法一我们是将A分段然后相加,判断A与B是否相等,但是我们可以发现A+A就包含了上述所有的旋转结果,因此我们只需要判断B是否为A+A的字串即可。
class Solution {
public:
bool solve(string A, string B) {
if(A == B)
return true;
if(A.length() != B.length()) //先排除AB大小不相等的情况,即B本身为A的字串的情况
return false;
string temp = A + A; //连接两个A
if(temp.find(B) == -1) //B是否为连接两个A的字串
return false;
return true;
}
};
复杂度分析:
- 时间复杂度:O(n2),n为字符串A的长度,find函数复杂度为O(n2)
- 空间复杂度:O(n),临时变量存储A+A