思路:

题目的主要信息:

  • 对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)O(n^2)O(n2),n为字符串A的大小,一次遍历,每次比较复杂度为O(n)
  • 空间复杂度:O(n)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)O(n^2)O(n2),n为字符串A的长度,find函数复杂度为O(n2)O(n^2)O(n2)
  • 空间复杂度:O(n)O(n)O(n),临时变量存储A+A