LeetCode 459. 重複的子字串 | Python
阿新 • • 發佈:2020-08-24
459. 重複的子字串
題目來源:力扣(LeetCode)https://leetcode-cn.com/problems/repeated-substring-pattern
題目
給定一個非空的字串,判斷它是否可以由它的一個子串重複多次構成。給定的字串只含有小寫英文字母,並且長度不超過10000。
示例 1:
輸入: "abab"
輸出: True
解釋: 可由子字串 "ab" 重複兩次構成。
示例 2:
輸入: "aba"
輸出: False
示例 3:
輸入: "abcabcabcabc" 輸出: True 解釋: 可由子字串 "abc" 重複四次構成。 (或者子字串 "abcabc" 重複兩次構成。)
解題思路
思路:列舉
先審題,題目中要求某個字串是否是由某個子串重複多次構成。
這裡我們假設字串 cur_string
是由某個子串 sub_string
重複多次構成。結合示例,嘗試分析裡面的規律。
如果按照 sub_string
的長度去劃分 cur_string
字串,這裡一定是能夠完整劃分的,也就是說:
sub_string
的長度是cur_string
長度的倍數;- 同樣的,每個劃分部分的子串都是同樣的。令
m = len(sub_string)
,也就說相隔長度 m,前後兩個子串對應的字元是相同的。(後續子串部分同樣成立)
如下列圖示:
以子串的長度劃分給定字串
相隔長度 m(子串長度),對應的字元相同
但是這裡需要注意,這裡重複次數至少有 1 次,那麼子串的長度不會大於給定字串長度的一半。那麼我們列舉的時候,只要在 [1, n/2]
(n:給定字串的長度)的範圍內檢查是否有符合條件的情況。
那麼,根據上面的分析,現在我們說下列舉的具體方法(下面部分 n 表示給定字串的長度):
- 在
[1, n/2]
開始遍歷,先查詢能被 n 整除的數字 i; - 當找到 i 時, i 也就是此時子串的長度。此時判斷子串是否能重複多次構成給定的字串。從
[i, n]
開始判斷,根據前面分析的情況二,相隔長度 i(子串長度),對應的字元是相同的。
具體程式碼實現如下。
程式碼實現
class Solution: def repeatedSubstringPattern(self, s: str) -> bool: n = len(s) # 子串至少重複一次 for i in range(1, n//2+1): if n % i == 0: if all(s[j]==s[j-i] for j in range(i, n)): return True return False
實現結果
歡迎關注
公眾號 【書所集錄】