学习还是要灵活些,两种方法,巧妙与粗暴的对比

暴力解法

思路:一个一个挨着拼出来比,遇到合适的return true,到最后都没有,就return false

class Solution {
public:
    bool solve(string A, string B) {
        // write code here
        if(A == B) return true;   //A,B 一样,直接return
        int al = A.length(), bl = B.length(), i, j;
        if(al != bl) return false;
        for(i=1; i<al; i++){
            string tmp;
            for(j=i; j<al; j++) tmp+=A[j];
            for(j=0; j<i; j++) tmp+=A[j];
            if(tmp == B) return true;
        }
        return false;
    }
};

巧妙的办法

思路:如果A分割开转换位置可以拼成B,那么如果两个A直接合并,一定中间有个B。

eg:

A=“qwerty”, B="rtyqwe", 这两个字符串很明显A是可以通过分割转换得到B的

我们如果直接将两个A合起来,即(A+=A),就可以得到一个这样的字符串 “qwertyqwerty”

可以看到两个A合并后,中间正好是B

class Solution {
public:
    bool solve(string A, string B) {
        // write code here
        int len1 = A.size(), len2 = B.size();
        if (len1 != len2) {
            return false;
        }
        A += A;
        if (A.find(B) != A.npos) {
            return true;
        }
        return false;
    }
};