給定一個非空的字符串,判斷它是否可以由它的一個子串重複多次構成。給定的字符串只含有小寫英文字母,並且長度不超過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;
}