Leetcode 459. 重複的子字符串 Repeated Substring Pattern

給定一個非空的字符串,判斷它是否可以由它的一個子串重複多次構成。給定的字符串只含有小寫英文字母,並且長度不超過10000。

示例 1:

輸入: “abab”

輸出: True

解釋: 可由子字符串 “ab” 重複兩次構成。
示例 2:

輸入: “aba”

輸出: False
示例 3:

輸入: “abcabcabcabc”

輸出: True

解釋: 可由子字符串 “abc” 重複四次構成。 (或者子字符串 “abcabc” 重複兩次構成。)

鏈接:459. 重複的子字符串

週期串爲s,那麼設定t表示週期,值在[1,len(s)-1]的範圍,那麼剩下的就是依次對每個t值進行
遍歷看是否真的滿足週期爲t,數學中週期的表達式是

f(x+t)=f(x)
​	
那麼代碼中可以這樣寫s[i%t]==s[i]

bool repeatedSubstringPattern(string s) {
    int len=s.size(),i=0,t=0;
    for(t=1;t<=len/2;++t)
    {
        if (len%t) continue;    // 有餘數,一定不爲週期串
        for (i=t;i<len&&s[i%t]==s[i];++i);
        if (i==len) return true;
    }
    return false;
}

上面是數學方法,並且算是遍歷,下面是其他方法:假設母串S是由子串s重複N次而成, 則 S+S則有子串s重複2N次, 現在S=Ns, S+S=2Ns 因此S在(S+S)[1:-1]中必出現一次以上

同時注意c++ string.find 函數沒找到 返回 string.npos

c.find(s)!=c.npos

    bool repeatedSubstringPattern(string s) {
        string c = s + s;
        c = c.substr(1,c.size()-2);
        if(c.find(s)!=c.npos) return true;
        else return false;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章