-
链接 : 原题
-
题意 :
给定一个字符串a和b,判断 a重复加自身几次,b才是a的子串。 -
思路:
这里的子串是连续子串,并不是按顺序存在b里所有字母即可。所以我用的是 string里的find。
题目说如果永远不可能,就输出-1,那么这个判定条件颇耐人寻味。如果不断加a后的字符串str的长度 > a + b的长度 - 1,那么b就不可能是a的子串了。原因很简单,我们设 len1是a的长度,len2是b的长度。判断b是否是a的子串,就从 a[0] ——a[len1-1] ,向后选取 len2 的字符串,判断是否和b相等。而当不断加a后的字符串长度 > a+b - 1后,再添加a,生成的 len2长度的子串 是重复的。
举个例子说:
A = abc len1 = 3
B = acacacac len2 = 8
当A长度 < B 长度时,自然不用多说,不满足。
当A = abcabcabc时,判断B是否是A的子串,从A[0]开始选取 长度为8的字符串:
abcabcab bcabcabc 都不满足
当A = abcabcabcabc时,
abcabcab bcabcabc cabcabca 都不满足,接下来所有的字符串都是重复的,因为A 原始3个字符为起始,长度为8的字符串都选取完了。而满足能将 A原始len1 个 字符起始,长度为len2的字符串选取完的字符串长度 > len1 + len2 - 1. -
代码:
class Solution {
public:
int repeatedStringMatch(string A, string B) {
int t = 1;
string tmp = A;
int len1 = A.length(), len2 = B.length();
while(tmp.find(B) == -1){
if(tmp.length() > len1 + len2 - 1){
return -1;
}
tmp += A;
t++;
}
return t;
}
};
- 遇到的问题:
(1)对子串的意思搞错了。直接用 string的find即可。
(2)对跳出循环判断条件没想到。