LeetCode 686 重複疊加字符串

  • 鏈接 : 原題

  • 題意 :
    給定一個字符串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)對跳出循環判斷條件沒想到。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章