-
鏈接 : 原題
-
題意 :
給定一個字符串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)對跳出循環判斷條件沒想到。