題目:
Given a string s, check if it can be constructed by taking a substring of it and appending multiple copies of the substring together.
給定一字串,判斷其是否由一重複字串組成
ex:input:"abab"=>output:True
explanation: It is the substring "ab" twice.
我採取我當下最直觀的作法
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
for i in range(1,len(s)//2+1):
if len(s)%i:
continue
if s[:i]*(len(s)//i)==s:
return True
return False
若該字串符合題目條件
則從第一項開始的長度為1~(len(s)//2+1)的子字串中(重複字串長度不可能超過原字串的一半)
其中有一個就是題目要的重複字串
於是我們將其一個一個拿出來驗證
先看子字串長度能否整除原字串
因為能整除原字串該子字串才有可能是組成原字串的重複字串
接著看將該子字串重複至和原字串一樣長看兩者是否相等
若相等直接回傳True,反之則繼續看下個可能
如果這些可能都不符合期待的話,回傳False
最後執行時間51ms(faster than 84.36%)
另一個解法是在討論區看到的
我認為十分巧妙,所以特別分享一下
class Solution:
def repeatedSubstringPattern(self, s: str) -> bool:
return s in s[1:]+s[:-1]
將一個s去頭,一個s去尾,兩者結合
若該新字串中存在s,則s為一重複字串組成
這解法似乎還有證明,我大概用實例講一下
假設一字串a,而aa就是符合題目期待的字串模式
我們將兩aa相連去頭去尾,假設a去頭為b,去尾為c
則新字串變為baac,可以發現aa存在於其中
這方法套用在驗證其他形式的以重複字串組成字串也一樣行得通
最後執行時間35ms(faster than 97.55%)
那我們下題見