首先用必要性来判断一下, a中必须出现b中出现的所有字符。
然后我们先将字符串a 平行移动若干次,至少移动n/m次,其中n为b的长度,m为a的长度,然后进行一次字符串子串匹配,直接使用find函数。
如果成功,那么返回,如果不成功,那么还要在平移一次,因为当n不能被m整除时,此时字符串a的长度还是小于m的长度。
那么是否这样就行了,答案是否定的,因为极端情况下,a的最后一次字符开头与b字符串匹配,因此还要在平移一次。
完整代码:
class Solution {
public:
int repeatedStringMatch(string a, string b) {
vector<bool> dict(26);
for (auto c : a) {
dict[c - 'a'] = true;
}
for (auto c : b) {
if (!dict[c - 'a']) {
return -1;
}
}
int k = b.size() / a.size();
string res;
res.reserve(b.size());
for (int i = 0; i < k; ++i) {
res.append(a);
}
for (int i = 0; i < 3; ++i) {
if (res.find(b) != string::npos) {
return k + i;
}
res.append(a);
}
return -1;
}
};