题目描述
给定两个字符串 A 和 B, 寻找重复叠加字符串A的最小次数,使得字符串B成为叠加后的字符串A的子串,如果不存在则返回 -1。
举个例子,A = "abcd",B = "cdabcdab"。
答案为 3, 因为 A 重复叠加三遍后为 “abcdabcdabcd”,此时 B 是其子串;A 重复叠加两遍后为"abcdabcd",B 并不是其子串。
注意:
A
与 B
字符串的长度在1和10000区间范围内。
解题思路
不断将字符串A叠加,叠加结果记为t,当t的长度大于等于B的时候,开始找t中是否有B这个子串存在。
什么时候停止呢?也就是说到什么时候可以判定t中不存在B子串?
如果B是n个A叠加之后的一个子串,那么最极端的情况也就是B的头部是A的后面一部分,B的尾部是A的前面一部分,比如:
A = "abc" ; B= "cabcabca";
那么当A叠加到B的长度再加上A长度的两倍的时候就可以判断了;当 n * lenA > lenB + 2 * lenA的时候,t中都找不到B这个子串,那么就可以返回-1.
当t = abcabcabc 长度为9的时候,可以找是否存在B,这个时候不存在,t的长度< lenB + 2 * lenA
当t = abcabcabcabc 长度为12的时候,找到了B,长度小于lenB + 2*lenA = 14;可以返回叠加次数了;
如果没有找到,当再继续叠加的时候,超过了lenB + 2*lenA = 14,就可以返回-1了。
AC代码
class Solution {
public:
int repeatedStringMatch(string A, string B) {
int count = 1, lena = A.size(), lenb = B.size();
string t = A;
while (count * lena <= 2 * lena + lenb)
{
if(count * lena >= lenb)
if(t.find(B) != string::npos)
return count;
t += A;
count++;
}
return -1;
}
};