686.Repeated String Match

686.Repeated String Match

难度:Easy

Given two strings A and B, find the minimum number of times A has to be repeated such that B is a substring of it. If no such solution, return -1.

For example, with A = "abcd" and B = "cdabcdab".

Return 3, because by repeating A three times (“abcdabcdabcd”), B is a substring of it; and B is not a substring of A repeated two times ("abcdabcd").

Note: The length of A and B will be between 1 and 10000.

可以将A循环补至长度大于B,然后判断B是否是增补的A的子集。 最后确定循环的A的次数。

class Solution {
public:
int repeatedStringMatch(string A, string B) {
int t= B.size()/A.size()+1;
string tmp=A;
while(t--)
{
tmp+=A;
}
size_t start= tmp.find(B);
if(start ==string::npos) return -1;
int end=start+B.size()-1;
if(end == start) return 1;
// cout<<start<<" "<< end << endl;
start = start/A.size() *A.size();
end = ((end+1)/A.size()+((end+1)%A.size() !=0) ) *A.size();
// cout<<start<<" "<< end << endl;
return (end-start)/A.size();
}
};

执行用时 :12 ms, 在所有 C++ 提交中击败了97.00%的用户 内存消耗 :9.1 MB, 在所有 C++ 提交中击败了82.83%的用户